[英]how to fix ConcurrentModificationExceptions in multi-threaded environment?
这是我不断得到的错误。
"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)"
您需要列表的同步视图。
List list = Collections.synchronizedList(new ArrayList());
...
synchronized (list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
您的问题是您正在从迭代器循环内部更改基础列表。 您应该在Announce.java的第22行显示代码,以便我们可以看到您具体在做什么,但是可以在开始循环之前复制列表,使用for循环而不是迭代器,或者保存要删除的项目从列表到新列表,然后在完成迭代器循环后将它们按批量删除即可。
您可以使用以下方法来避免ConcurrentModificationException:
ListIterator
Synchronizers
CopyOnWrite
toArray()
Concurrent Collections:
在这种情况下,您可以使用ConcurrentHashMap
Collection API中的ConcurrentHashMap。我认为这很简单,并且不会仅出于更新而冻结对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.