并发线程同时添加到 ArrayList - 会发生什么情况?

我们有多个线程调用 .add(obj)ArrayList

我的理论是,当由两个线程同时调用时,所添加的两个对象中只有一个真正被添加到 .这合理吗?addArrayList

如果是这样,您如何解决这个问题?使用同步集合,如 ?Vector


答案 1

对于由 ArrayList 上的两个线程并发调用 add 时发生的情况,没有保证行为。但是,根据我的经验,这两个对象都被很好地添加了。与列表相关的大多数线程安全问题都处理添加/删除时的迭代。尽管如此,我强烈建议不要使用具有多个线程和并发访问的vanilla ArrayList。

Vector曾经是并发列表的标准,但现在的标准是使用集合同步列表

另外,我强烈推荐Goetz等人的Java Concurrency in Practice,如果你打算花时间在Java中处理线程。这本书更详细地介绍了这个问题。


答案 2

任何事情都可能发生。您可以正确添加这两个对象。您只能添加一个对象。您可能会收到 ArrayIndexOutOfBounds 异常,因为基础数组的大小未正确调整。或者可能会发生其他事情。可以说,你不能依赖任何发生的行为。

作为替代方案,您可以使用、您可以使用、可以使用 或使用单独的锁。这完全取决于您正在执行的其他操作以及您对集合的访问权限具有何种控制权。VectorCollections.synchronizedListCopyOnWriteArrayList


推荐