来自这篇文章,它说:
当我们使用任何修改方法时——例如 add() 或 remove()——CopyOnWriteArrayList 的全部内容被复制到新的内部副本中。
由于这个简单的事实,我们可以以安全的方式迭代列表,即使发生并发修改。
当我们在 CopyOnWriteArrayList 上调用 iterator() 方法时,我们会返回一个由 CopyOnWriteArrayList 内容的不可变快照备份的迭代器。
它的内容是创建迭代器时 ArrayList 中数据的精确副本。即使同时其他线程从列表中添加或删除元素,该修改也会制作数据的新副本,该副本将用于从该列表中进行任何进一步的数据查找。
接下来要问自己的一个简单问题是为什么两者兼而有之?基本上,据我了解,写操作是在新副本上进行的,而读操作是在集合的克隆上进行的。
例如,如果在新副本上完成写入,这意味着我可以迭代“原始”集合——这意味着它不会受到影响。那么为什么要在另一个副本(快照)中增加存储元素的开销呢?或者相反的方向,如果我将元素存储在副本(快照)中,为什么需要在副本上完成写入,当我从字面上迭代克隆而不是“原始”集合时(意味着快照永远不会改变)?
我希望这个问题是合法的,因为我确实检查了互联网上所有可能的来源,但没有一篇文章帮助我消除这种困惑。我在这里想念什么?