我们有多个线程在 add(obj)
ArrayList
。
我的理论是,当两个线程同时调用 add
时,只有两个被添加的对象中的一个真正添加到 ArrayList
。这合理吗?
如果是这样,你如何解决这个问题?使用像 Vector
这样的同步集合?
原文由 Marcus Leon 发布,翻译遵循 CC BY-SA 4.0 许可协议
我们有多个线程在 add(obj)
ArrayList
。
我的理论是,当两个线程同时调用 add
时,只有两个被添加的对象中的一个真正添加到 ArrayList
。这合理吗?
如果是这样,你如何解决这个问题?使用像 Vector
这样的同步集合?
原文由 Marcus Leon 发布,翻译遵循 CC BY-SA 4.0 许可协议
任何事情都可能发生。您可以正确添加两个对象。您只能添加其中一个对象。您可能会收到 ArrayIndexOutOfBounds 异常,因为基础数组的大小未正确调整。或者可能会发生其他事情。只要说你不能依赖任何发生的行为就足够了。
作为替代方案,您可以使用 Vector
,您可以使用 Collections.synchronizedList
,您可以使用 CopyOnWriteArrayList
,或者您可以使用单独的锁。这完全取决于您还做了什么,以及您对集合的访问权限有什么样的控制。
原文由 Matthew T. Staebler 发布,翻译遵循 CC BY-SA 2.5 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
对于 ArrayList 上的两个线程同时调用 add 时发生的情况,没有保证的行为。但是,根据我的经验,这两个对象都添加得很好。大多数与列表相关的线程安全问题都是在添加/删除时处理迭代。尽管如此,我还是强烈建议不要使用具有多线程和并发访问的普通 ArrayList。
Vector 曾经是并发列表的标准,但现在的标准是使用 Collections 同步列表。
如果您打算花时间在 Java 中使用线程,我还强烈推荐 Goetz 等人的 Java Concurrency in Practice。这本书更详细地介绍了这个问题。