每当我们使用 java.util Collection 类时,如果一个线程更改集合而另一个线程正在使用迭代器遍历它,那么任何对 iterator.hasNext()
或 iterator.next()
将抛出 ConcurrentModificationException
。即使是 synchronized
集合包装器类 SynchronizedMap
和 SynchronizedList
也只是有条件的线程安全的,这意味着所有单独的操作都是线程安全的,但复合操作是控制流取决于先前操作的结果,可能会受到线程问题的影响。问题是:如何在不影响性能的情况下避免这个问题。注意:我知道 CopyOnWriteArrayList
。
最佳答案
您可以使用上面提到的 CopyOnWriteArrayList
或 ConcurrentHashMap
等,或者您可以使用与 CAS 一起工作的 Atomic*
类。
如果您不知道 Atomic*
类,它们绝对值得一看!您可以查看this问题。
因此,要回答您的问题,您必须为任务选择正确的工具。由于您不与我们分享上下文,我只能猜测。在某些情况下,CAS 会在其他情况下表现得更好,而并发 Collections 会。
如果有什么不清楚的地方,您可以随时查看官方 Oracle Trails:Lesson: Concurrency
关于java - 如何在多线程代码中避免ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13322787/