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