这是我一直在犯的错误。
"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)"
答案 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
。我认为这很容易,并且不会仅在更新时冻结对象。