为什么CopyOnWriteArrayList安全?

时间:2014-08-30 11:12:21

标签: java multithreading

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

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

当线程 A 复制值时,线程 B 也想添加新元素 f 。因此,它复制所有值而不用 e 添加 f ,然后更新对数组的引用。

在这种情况下,数组中可能没有元素 e

这里如何实现线程安全?

1 个答案:

答案 0 :(得分:9)

所有修改方法(addsetremoveclear等)都受到锁定的保护。这就是你如何正确的写入顺序。但是,由于写时复制,这意味着每个支持数组都是有效的不可变的,这意味着只读操作不需要锁定。 (持有支持数组的字段为volatile,因此您仍然可以获得正确的发生前行为。)