如何在写集合上复制提供线程安全性?

prv*_*rvn 5 java multithreading

如何在写集合上复制提供线程安全性以及它们在哪些场景中有用?

You*_*bit 3

写入数组列表时复制

CopyOnWriteArrayList 的实例充当 List 实现,允许多个并发读取,并且读取与写入同时发生。这样做的方法是每次更改列表时都会创建一个全新的副本。

  1. 读取不会阻塞,并且实际上仅支付易失性读取的成本。
  2. 写入不会阻止读取(反之亦然),但一次只能发生一次写入。
  3. 与 不同ConcurrentHashMap,写入或访问列表中的多个元素(例如addAll(), retainAll())的写入操作将是原子的。

在写入操作期间,必须完全锁定阵列以防止其他写入。(标准实现使用ReentrantLock。)但是,这确实意味着如上所述,影响多个位置的操作可以是原子的。也就是说,如果一个线程使用 addAll() 将多个项目添加到列表中,而另一个线程调用 size(),则读取大小的线程将获得一个值,该值要么反映或不反映 addAll() 中添加的元素数量:不可能返回中间值(当然前提是这些是唯一访问该列表的两个线程!)。

CopyOnWriteArrayList 专为以下情况而设计reads hugely outnumber writes

写时复制数组集

另一个类CopyOnWriteArraySet是建立在CopyOnWriteArrayList. 与对应的列表一样,它是为集合仅包含少数元素且读取数量大大超过写入数量的情况而设计的。

参考:Java 写时复制集合