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

时间:2015-09-21 09:31:28

标签: java multithreading

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

2 个答案:

答案 0 :(得分:1)

这样做的方法是每次更改列表时制作一个全新的列表副本。

读取不会阻塞,并且只会有效地支付易失性读取的成本。 写入不会阻止读取(反之亦然),但一次只能进行一次写入。

答案 1 :(得分:0)

<强>的CopyOnWriteArrayList

CopyOnWriteArrayList的实例表现为List实现,允许多个并发读取,并且读取与写入同时发生。它的方式是每次更改列表时制作一个全新的列表副本。

  1. 读取不会阻止,只会有效地支付易失性读取的费用。
  2. 写入不阻止读取(反之亦然),但一次只能进行一次写入。
  3. ConcurrentHashMap不同,编写或访问列表中多个元素的写操作(例如addAll()retainAll())将是原子的。
  4. 在写入操作期间,必须完全锁定阵列以防止其他写入。 (标准实现使用 ReentrantLock 。)但是,这确实意味着如上所述,影响多个位置的操作可以是原子的。也就是说,如果一个线程使用addAll()将多个项添加到列表中,而另一个线程调用size(),则读取该大小的线程将获得一个反映或不反映addAll()中添加的元素数的值:那里不可能返回中间值(前提是这些是访问列表的唯一两个线程!)。

    CopyOnWriteArrayList适用于reads hugely outnumber writes

    的情况

    <强> CopyOnWriteArraySet

    另一个类CopyOnWriteArraySet构建于CopyOnWriteArrayList之上。与其列表对应物一样,它设计用于集合仅包含少量元素且读取数量大大超过写入的情况。

    参考:Java copy-on-write collections