java - 为什么 CopyOnWriteArrayList 是安全的?

标签 java multithreading

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

线程A 想要向集合中添加一个新元素eCopyOnWriteArrayList创建新数组,从旧数组复制所有值,添加新元素 e,然后更新对包含元素 e 的新数组的引用。

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

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

这里是如何实现线程安全的?

最佳答案

所有修改方法(addsetremoveclear等)都由锁。这就是您获得正确写入顺序的方式。然而,由于写时复制,这意味着每个支持数组实际上是不可变的,这意味着只读操作不需要锁定。 (保存后备数组的字段是 volatile,因此您仍然可以获得正确的happens-before 行为。)

关于java - 为什么 CopyOnWriteArrayList 是安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25581724/

相关文章:

java - 我们可以用JMeter做哪些类型的项目测试

multithreading - FireDAC amBlocking 与 amNonBlocking 命令执行

c# - 应该异步执行对 NetworkStream 的写入

java - 从一个 Activity 传递到另一个 Activity 时,int/string 值变为 "0"/null

java - 波纹效果在 Android 9(Api 28、Pie)上无法正常工作

java - Cometd 过滤 channel 中特定客户端的数据

java - 尝试使用线程时程序锁定

java - Spring Security 找不到自定义 UserDetailsS​​ervice

java - 不显示 Android 应用程序的准确输出

c# - 线程合并排序比串行实现慢