繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM