如何在多线程环境中修复ConcurrentModificationExceptions?

时间:2012-04-30 04:17:18

标签: java exception-handling

这是我一直在犯的错误。

"Exception in thread "Thread-3" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:782)
at java.util.ArrayList$Itr.next(ArrayList.java:754)
at group1.bt.Announce.run(Announce.java:22)
at java.lang.Thread.run(Thread.java:679)"

3 个答案:

答案 0 :(得分:3)

您的问题是您正在从迭代器循环内部更改基础列表。你应该在Announce.java的第22行显示代码,这样我们就可以看到你做错了什么,但是在开始循环之前复制你的列表,使用for循环而不是迭代器,或者保存你想要删除的项目从列表到新列表,然后在完成迭代器循环之后将其删除它们将起作用。

答案 1 :(得分:2)

您需要同步查看列表。

List list = Collections.synchronizedList(new ArrayList());
   ...
synchronized (list) {
   Iterator i = list.iterator(); // Must be in synchronized block
   while (i.hasNext())
       foo(i.next());
}

答案 2 :(得分:0)

您可以使用以下方法来避免ConcurrentModificationException:

 ListIterator

    Synchronizers

    CopyOnWrite

    toArray()

    Concurrent Collections:

在这种情况下,您可以使用来自Concurrent Collection API的ConcurrentHashMap。我认为这很容易,并且不会仅在更新时冻结对象。