由于我们在flyweight设计模式中共享的对象是不可变的,所以我想知道是否需要考虑同步性? 即使多个线程尝试访问相同的对象并插入共享池中(由于对象始终相同),我认为我们也不需要同步,请对此加以说明。谢谢
public class WeakPool<T> {
private final WeakHashMap<T, WeakReference<T>> pool = new WeakHashMap<T, WeakReference<T>>();
public T get(T object) {
final T res;
WeakReference<T> ref = pool.get(object);
if (ref != null) {
res = ref.get();
} else {
res = null;
}
return res;
}
public void put(T object) {
pool.put(object, new WeakReference<T>(object));
}
}
public class InternPool<T> {
private final WeakPool<T> pool = new WeakPool<T>();
public synchronized T intern(T object) {
T res = pool.get(object);
if (res == null) {
pool.put(object);
res = object;
}
return res;
}
}
这是此帖子中的代码:Generic InternPool<T> in Java?
问题是我们需要在此intern方法上进行同步吗?
答案 0 :(得分:0)
flyweight模式的大多数多线程实例在构造,获取或释放共享组件时都需要同步,即使flyweight对象本身是不可变的。这取决于所涉及的特定数据结构。
同步要求通常由实现细节而不是设计模式确定。它们应该隐藏在适当的接口后面。