CopyOnWriteArrayList
的Javadocs说
我现在很困惑,何时其他线程会看到此新副本中存在更改?这是否意味着基础数组的副本数等于集合的突变数?如果不是这样,何时将这些单个副本的更改转移到基础数组,以便其他线程可以看到它们?
最佳答案
这里的想法是,每当您添加或删除CopyOnWriteArrayList
时,基本数组就基本上随修改内容被复制。
是的,对于每个更新ArrayList
的线程,所有其他持有较旧副本的线程实质上都将引用不同的数组。
您当前正在查看的数组(假设您的迭代器)将永远不会改变。当您从数组中读取数据时,您将像开始读取时一样读取它。如果CopyOnWriteArrayList
由另一个线程更改,则当前正在观察的数组将不受影响。
为了获得最新版本,请像list.iterator();
这样重新读取
话虽这么说,大量更新此集合会降低性能。如果您尝试对CopyOnWriteArrayList
进行排序,则会看到该列表会抛出一个UsupportedOperationException
(排序调用集合上设置的N次)。仅当您进行超过90%以上的读取时,才应使用此读取。