CopyOnWriteArrayList的行为
CopyOnWriteArrayList
Javadocs说
ArrayList的线程安全变体,其中所有可变操作(add,set等)都通过创建底层数组的新副本来实现。
现在我很困惑其他线程何时会看到这个新副本中存在的变化? 这是否意味着底层数组的副本数量等于集合中的突变数量? 如果不是,那么这些单独副本的更改何时传输到底层数组,以便其他线程可以看到它们?
这里的想法是,无论何时添加或移除到CopyOnWriteArrayList
,基本数组都基本上与修改一起复制。
这是否意味着底层数组的副本数量等于该集合的突变数量
是的,对于更新ArrayList
每个线程,所有其他保持旧副本的线程实际上都会引用不同的数组。
这些单独副本的更改何时转移到底层数组,以便其他线程可以看到它们?
你目前正在查看的数组(永远不会改变你的迭代器)。 当你从一个数组中读取数据时,你正在阅读它,就像你开始阅读时一样。 如果CopyOnWriteArrayList
由另一个线程改变,那么当前观察的数组将不会受到影响。
要获得最新版本,请执行一个新的读取,如list.iterator();
话虽如此,更新这个集合很会杀死性能。 如果您尝试对CopyOnWriteArrayList
进行排序,您将看到该列表将引发UsupportedOperationException
(该排序在集合上调用集N次)。 只有在读数超过90%时,才应使用此读数。
上一篇: Behaviour of CopyOnWriteArrayList
下一篇: What issues should be considered when overriding equals and hashCode in Java?