对于写入(添加)操作,CopyOnWriteArrayList使用ReentrantLock并创建数据的备份副本,并且仅通过setArray更新基础的易失性数组引用(在setArray之前的列表上的任何读取操作都将在添加之前返回旧数据)。
CopyOnWriteArrayList提供快照故障安全迭代器,并且在写入/添加操作时不会引发ConcurrentModifficationException。
但是,当我检查CopyOnWriteArrayList.class的add方法时,我们正在获取对完整集合对象的锁定。那么,CopyOnWriteArrayList为何比syncedList更好。我在CopyOnWriteArrayList的add方法中看到的唯一区别是,每次调用add方法时,我们都在创建该数组的副本。
- 不,锁不是在整个Collection对象上。如上所述,它是一个ReentrantLock,它与内部对象锁不同。
- add方法将始终创建现有数组的副本,并对副本进行修改,然后最终更新该数组的volatile引用以指向此新数组。这就是为什么我们使用“ CopyOnWriteArrayList”这个名称的原因-在您写入时创建副本。这也避免了ConcurrentModificationException



