根据我的理解,并发集合类比同步集合更可取,因为并发集合类不会锁定完整的集合对象。相反,它们在收集对象的一小部分上锁定。
但是,当我检查add
的CopyOnWriteArrayList
方法时,我们获得了对完整集合对象的锁定。那么CopyOnWriteArrayList
怎么比Collections.synchronizedList
返回的列表更好呢?我在add
的CopyOnWriteArrayList
方法中看到的唯一区别是,每次调用add
方法时,我们都会创建该数组的副本。
public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e;
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}
最佳答案
对于写(添加)操作,CopyOnWriteArrayList使用ReentrantLock并创建数据的备份副本,并且仅通过setArray来更新基础的 volatile 数组引用(在setArray之前的列表上的任何读取操作都将在添加之前返回旧数据)。 CopyOnWriteArrayList提供快照故障安全迭代器,并且在写入/添加操作时不会引发ConcurrentModifficationException。