假设我有一个数组[a, b, c, d]
线程A 想要向集合中添加一个新元素e。 CopyOnWriteArrayList
创建新数组,从旧数组复制所有值,添加新元素 e,然后更新对包含元素 e 的新数组的引用。
当线程A 复制值时,线程B 也想添加一个新元素f。因此它复制所有值而不添加 e 添加 f 然后更新对数组的引用。
在这种情况下,数组中可能没有元素 e。
这里是如何实现线程安全的?
最佳答案
所有修改方法(add
、set
、remove
、clear
等)都由锁。这就是您获得正确写入顺序的方式。然而,由于写时复制,这意味着每个支持数组实际上是不可变的,这意味着只读操作不需要锁定。 (保存后备数组的字段是 volatile
,因此您仍然可以获得正确的happens-before 行为。)
关于java - 为什么 CopyOnWriteArrayList 是安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25581724/