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

新手上路,请多包涵

我们有多个线程在 add(obj) ArrayList

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

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

原文由 Marcus Leon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 772
2 个回答

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

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

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

原文由 derivation 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

作为替代方案,您可以使用 Vector ,您可以使用 Collections.synchronizedList ,您可以使用 CopyOnWriteArrayList ,或者您可以使用单独的锁。这完全取决于您还做了什么,以及您对集合的访问权限有什么样的控制。

原文由 Matthew T. Staebler 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题