写时复制被认为是并发方案中的良好实践之一。但是,我不清楚它与写方法上的简单锁/同步有何不同。有人可以帮忙解释一下吗?

写时复制:

    public V put(K key, V value) {
        synchronized (this) {
            Map<K, V> newMap = new HashMap<K, V>(internalMap);
            V val = newMap.put(key, value);
            internalMap = newMap;
            return val;
        }
    }

直接锁定/同步:
    public V put(K key, V value) {
        synchronized (this) {
            internalMap.put(key, value);
        }
    }

对于写线程,在​​上面的两个示例中,它们是互斥的,同样。

对于读取线程,在“写时复制”中,运行“internalMap = newMap”后的读取 Action 将获取更新后的值。并且在直接锁定中,运行“internalMap.put(key,value)”后的读取 Action 将获得更新后的值。

那么,为什么我们要推广写时复制?为什么我们在写时必须“复制”?

最佳答案

此示例的一个好处是,您可以获得写时复制的快照语义:对internalMap的每个引用都是不可变的,一旦获得,就不会再更改。当您有许多并发的读取操作遍历internalMap且仅偶尔进行更新时,这可能会很有用。

09-26 12:46