【问题标题】:Why can there be just one write in CopyOnWriteArrayList?为什么 CopyOnWriteArrayList 中只能写一个?
【发布时间】:2020-08-21 12:11:45
【问题描述】:
CopyOnWriteArrayList 做得很好。我可以同时从多个线程读取,但我可以从 1 个线程更新。它的工作方式是写入使用数组的单独副本,更新信息并将其设置回原始数组。
问题是:既然写操作使用单独的副本,他们怎么不能并行呢?由于它们现在在不同的阵列中工作,因此不会有任何干扰。因此,无论谁写第一个,它都会将这些新更新设置为原始数组。那么为什么 Java 只允许一次写入呢?
我在这里遗漏了什么,为什么只能写 1 个线程?
【问题讨论】:
标签:
java
copyonwritearraylist
【解决方案1】:
如果两个线程同时将一个元素添加到 CopyOnWriteArrayList,我们希望这两个元素随后都出现在列表中。 CopyOnWriteArrayList 的设计者和用户不希望元素因竞争条件而丢失。
展开:如果你有两个线程,并且它们执行以下操作:
线程 1:list.add("A");
线程 2:list.add("B");
预期的最终结果是list 同时包含 A 和 B,即使不一定按此顺序。