0

CopyOnWriteArrayList 做得很好。我可以同时从多个线程读取,但我可以从 1 个线程更新。它的工作方式是写入使用数组的单独副本,更新信息并将其设置回原始数组。

问题是:既然写操作使用单独的副本,他们怎么不能并行呢?由于它们现在在不同的阵列中工作,因此不会有任何干扰。因此,无论谁写第一个,它都会将这些新更新设置为原始数组。那么为什么 Java 只允许一次写入呢?

我在这里遗漏了什么,为什么只能写 1 个线程?

4

1 回答 1

2

如果两个线程同时向 CopyOnWriteArrayList 添加一个元素,我们希望这两个元素随后都出现在列表中。由于竞争条件而丢失的元素不是 CopyOnWriteArrayList 的设计者和用户想要的。

展开:如果你有两个线程,它们会执行以下操作:

线程1:list.add("A");

线程2:list.add("B");

预期的最终结果是同时list包含 A 和 B,即使不一定按该顺序。

于 2020-08-21T12:26:59.150 回答