CopyOnWriteArrayList的行为

CopyOnWriteArrayList Javadocs说

ArrayList的线程安全变体,其中所有可变操作(add,set等)都通过创建底层数组的新副本来实现。

现在我很困惑其他线程何时会看到这个新副本中存在的变化? 这是否意味着底层数组的副本数量等于集合中的突变数量? 如果不是,那么这些单独副本的更改何时传输到底层数组,以便其他线程可以看到它们?


这里的想法是,无论何时添加或移除到CopyOnWriteArrayList ,基本数组都基本上与修改一起复制。

这是否意味着底层数组的副本数量等于该集合的突变数量

是的,对于更新ArrayList每个线程,所有其他保持旧副本的线程实际上都会引用不同的数组。

这些单独副本的更改何时转移到底层数组,以便其他线程可以看到它们?

你目前正在查看的数组(永远不会改变你的迭代器)。 当你从一个数组中读取数据时,你正在阅读它,就像你开始阅读时一样。 如果CopyOnWriteArrayList由另一个线程改变,那么当前观察的数组将不会受到影响。

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

话虽如此,更新这个集合很会杀死性能。 如果您尝试对CopyOnWriteArrayList进行排序,您将看到该列表将引发UsupportedOperationException (该排序在集合上调用集N次)。 只有在读数超过90%时,才应使用此读数。

链接地址: http://www.djcxy.com/p/13277.html

上一篇: Behaviour of CopyOnWriteArrayList

下一篇: What issues should be considered when overriding equals and hashCode in Java?