我们需要在flyweight设计模式中进行同步吗?

时间:2019-04-15 14:01:55

标签: design-patterns concurrency synchronization

由于我们在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方法上进行同步吗?

1 个答案:

答案 0 :(得分:0)

flyweight模式的大多数多线程实例在构造,获取或释放共享组件时都需要同步,即使flyweight对象本身是不可变的。这取决于所涉及的特定数据结构。

同步要求通常由实现细节而不是设计模式确定。它们应该隐藏在适当的接口后面。