Java CopyOnWriteArrayList适用于哪些情况?

Java CopyOnWriteArrayList适用于哪些情况?,java,collections,Java,Collections,我正在了解这个班 复制新阵列的目的是什么 是否由其他线程读取数组 因此,如果系统具有高并发性,并且大多数线程的操作都是读而不是写,那么最好使用CopyOnWriteArrayList,如下所述: 是Java 5并发API中引入的一个并发集合类,以及它在Java中流行的表亲ConcurrentHashMap CopyOnWriteArrayList实现了列表接口,如ArrayList、Vector和LinkedList,但它是一个线程安全的集合,它实现线程安全的方式与Vector或其他线程安全

我正在了解这个班

  • 复制新阵列的目的是什么
  • 是否由其他线程读取数组
因此,如果系统具有高并发性,并且大多数线程的操作都是读而不是写,那么最好使用
CopyOnWriteArrayList

,如下所述:

是Java 5并发API中引入的一个并发集合类,以及它在Java中流行的表亲
ConcurrentHashMap

CopyOnWriteArrayList
实现了列表接口,如
ArrayList
Vector
LinkedList
,但它是一个线程安全的集合,它实现线程安全的方式与Vector或其他线程安全集合类略有不同

顾名思义,CopyOnWriteArrayList创建基础文件的副本 带有每个变异操作的ArrayList,例如添加或设置。正常地 CopyOnWriteArrayList非常昂贵,因为它涉及昂贵的 每次写操作都要进行数组复制,但是如果 列出迭代次数多于变异次数的列表,例如,您最需要 迭代ArrayList,不要经常修改它

CopyOnWriteArrayList的迭代器是故障安全的,不会抛出 ConcurrentModificationException即使是潜在的 CopyOnWriteArrayList在迭代开始时被修改,因为 迭代器正在对ArrayList的单独副本进行操作。因此所有 迭代器无法使用CopyOnWriteArrayList上的更新

要获得最新版本,请执行新的读取操作,如
list.iterator()

也就是说,大量更新此集合将降低性能。如果尝试对
CopyOnWriteArrayList
进行排序,您将看到该列表抛出一个
UnsupportedOperationException
(排序调用集合上的集合N次)。只有在执行超过90%的读取时,才应使用此读取

应对新阵列的目的是什么

复制底层数组可以保证数据结构的任何迭代都是安全的,因为迭代发生在数据的基本不变的“快照”上

是否由其他线程读取数组

有点。更具体地说,每个线程都能够安全地迭代数组,而不必担心出现
ConcurrentModificationException
或其他未知/未定义的行为

因此,如果系统是高并发的,并且大多数线程的操作是读操作而不是写操作,那么最好使用CopyOnWriteArrayList。我说得对吗

否。仅当大多数线程的操作是列表上的迭代时。如果大多数活动都是基于随机访问的读取,那么
ReadWriteLock
可能会更好

CopyOnWriteArrayList的javadoc

这通常成本太高,但在遍历操作的数量远远超过变异时,可能比其他方法更有效,并且在您无法或不想同步遍历但需要排除并发线程之间的干扰时非常有用


如果您需要经常向列表中添加项目,有时需要删除所有项目。你认为“同步”的方法是更好的方法吗?你可以考虑<代码> java。UTI.Outual< /Cuff>包>代码>集合。SimuleDistList。我已经在使用它了。但是,当我与旧的
synchronized
关键字结合使用时,它似乎就起作用了。当您迭代
集合时,我们不需要使用
synchronized
关键字,即使在使用
集合时也是如此。synchronizedList
@stdout-不,它不会引发ConcurrentModificationException。这是一个故障安全集合,使用单独的副本进行迭代。您能解释一下为什么
ReadWriteLock
可能更好吗?因为
CopyOnWriteArrayList
用于安全遍历。使用它的成本是为每次修改复制底层引用数组,并可能保留多个副本,以便线程在结构的过时版本上迭代。
ReadWriteLock
允许多个读卡器,但仍允许偶尔的编写器执行必要的修改。