CopyOnWriteArrayList的Javadocs说



我现在很困惑,何时其他线程会看到此新副本中存在更改?这是否意味着基础数组的副本数等于集合的突变数?如果不是这样,何时将这些单个副本的更改转移到基础数组,以便其他线程可以看到它们?

最佳答案

这里的想法是,每当您添加或删除CopyOnWriteArrayList时,基本数组就基本上随修改内容被复制。



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



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

为了获得最新版本,请像list.iterator();这样重新读取

话虽这么说,大量更新此集合会降低性能。如果您尝试对CopyOnWriteArrayList进行排序,则会看到该列表会抛出一个UsupportedOperationException(排序调用集合上设置的N次)。仅当您进行超过90%以上的读取时,才应使用此读取。

10-07 12:04