为什么CopyOnWriteArrayList安全?

use*_*356 6 java multithreading

说我有一个数组[a,b,c,d]

线程A想要向集合中添加新元素e.CopyOnWriteArrayList创建新数组,复制旧数组中的所有值,添加新元素e,然后使用元素e更新对新数组的引用.

线程A复制值时,线程B也想添加新元素f.因此,它没有复制所有值Ë增加˚F,然后更新参考阵列.

在这种情况下,阵列中可能没有元素e.

如何在这里实现线程安全?

Chr*_*ung 9

所有的修饰方法(add,set,remove,clear,等)被锁把守.这就是你如何正确的写入顺序.但是,由于写时复制,这意味着每个支持数组都是有效的不可变的,这意味着只读操作不需要锁定.(持有支持数组的字段是volatile,因此您仍然可以获得正确的事先发生行为.)