写时复制被认为是并发方案中的良好实践之一。但是,我不清楚它与写方法上的简单锁/同步有何不同。有人可以帮忙解释一下吗?
写时复制:
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
且仅偶尔进行更新时,这可能会很有用。