java - 如何在多线程代码中避免ConcurrentModificationException

标签 java collections concurrency

每当我们使用 java.util Collection 类时,如果一个线程更改集合而另一个线程正在使用迭代器遍历它,那么任何对 iterator.hasNext()iterator.next() 将抛出 ConcurrentModificationException。即使是 synchronized 集合包装器类 SynchronizedMapSynchronizedList 也只是有条件的线程安全的,这意味着所有单独的操作都是线程安全的,但复合操作是控制流取决于先前操作的结果,可能会受到线程问题的影响。问题是:如何在不影响性能的情况下避免这个问题。注意:我知道 CopyOnWriteArrayList

最佳答案

您可以使用上面提到的 CopyOnWriteArrayListConcurrentHashMap 等,或者您可以使用与 CAS 一起工作的 Atomic* 类。

如果您不知道 Atomic* 类,它们绝对值得一看!您可以查看this问题。

因此,要回答您的问题,您必须为任务选择正确的工具。由于您不与我们分享上下文,我只能猜测。在某些情况下,CAS 会在其他情况下表现得更好,而并发 Collections 会。

如果有什么不清楚的地方,您可以随时查看官方 Oracle Trails:Lesson: Concurrency

关于java - 如何在多线程代码中避免ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13322787/

相关文章:

java - 如何自动将 Object 引用转换为实例类型?

java - 从 JavaScript 检索数据的简单方法

java - Regex/Java - 如何捕获动态表中字符串后面的五位数字

java - IntelliJ IDEA 合约返回值不为空

java - 是否可以保留包含另一个集合的 map

java - 只是好奇...更好的方法复制/克隆 ArrayList 的一部分?

java - 如何将 Collections.synchronizedMap(new HashMap()) 转换为 Hash Map

c++ - 在库中使用全局变量

JAVA - 如何确保在执行器开始阻塞 UI 线程之前隐藏节点

java - finally 子句中的信号量操作