我正在学习CopyOnWriteArrayList类.
因此,如果系统具有高并发性并且大多数线程的操作都在读取而不是写入,则最好使用它CopyOnWriteArrayList.
Ank*_*thi 91
如此链接所述:
CopyOnWriteArrayList是Java 5 Concurrency API中引入的并发Collection类及其ConcurrentHashMap在Java中的流行表兄.
CopyOnWriteArrayList实现像List接口ArrayList,Vector并且LinkedList但它的一个线程安全的集合,它实现了线程安全比Vector或其他线程安全的集合类的方式略有不同.
顾名思义,CopyOnWriteArrayList使用每个变异操作(例如add或set)创建基础ArrayList的副本.通常,CopyOnWriteArrayList非常昂贵,因为它涉及每次写入操作都需要昂贵的Array副本,但是如果你有一个List,其迭代次数超过了变量,那么它非常有效.例如,你最需要迭代ArrayList而不要经常修改它.
CopyOnWriteArrayList的迭代器是故障安全的,并且即使在Iteration开始后修改了底层的CopyOnWriteArrayList 也不会抛出ConcurrentModificationException,因为Iterator在ArrayList的单独副本上运行.因此,Iterator无法使用CopyOnWriteArrayList上的所有更新.
要获得最新版本,请执行新的读取操作 list.iterator();
话虽这么说,更新这个集合很多将杀死性能.如果你试图排序,CopyOnWriteArrayList你会看到列表抛出一个UnsupportedOperationException(排序调用集合上的N次).只有在读取90%以上的读数时才应该使用此读数.
Tim*_*der 24
应对新阵列的目的是什么?
复制底层数组可确保数据结构的任何迭代都是安全的,因为迭代是在数据的基本上不可变的"快照"上进行的.
是否其他线程读取数组?
有点.更具体地说,每个线程都能够安全地迭代数组,而不必担心ConcurrentModificationException其他未知/未定义的行为.
因此,如果系统是高并发性并且大多数线程的操作都在读取而不是写入,则最好使用CopyOnWriteArrayList.我对吗?
不可以.只有大多数线程的操作都是列表上的迭代.如果大多数活动是基于随机访问的读取,则ReadWriteLock可能更好.
来自javadoc CopyOnWriteArrayList
这通常成本太高,但是当遍历操作大大超过突变时,它可能比替代方法更有效,并且当您不能或不想同步遍历但需要排除并发线程之间的干扰时非常有用.