java的ConcurrentModificationException的甚至同步(java Con

2019-10-18 17:54发布

类似的问题以前已经发布,但这种情况是不同的 - 有可能是它的复杂静态用法。 只是想看看是否有人对如何处理这个想法。 我得到的ConcurrentModificationException的,即使我使用的修改都围绕块名单上synchronzed。

public class Foo {
   public void register() {
       FooManager.addFoo(this);
   }
}

public class ABC1 {
   static Foo myfoo;
   static {
     myfoo = new Foo();
     myfoo.register();
   }
}

(我有类似的复式班ABC2,ABC3)

public class FooManager {
   static ArrayList<Foo> m_globalFoos;
   static ABC1 m_abc;
   static {
     m_globalFoos = new ArrayList<Foo>();
     m_abc = new ABC1();
   }


   public static void addFoo(Foo foo) {
     synchronized(m_globalFoos) { // SYNC
         m_globalFoos.add(foo);
      }
   }

    public static void showFoos() {
        synchronized(m_globalFoos) { //SYNC
            for (Foo foo : m_globalFoos) {
                     foo.print();
            }
    }
}

我宣布ABC1,ABC2,ABC3等在多个线程FUNC。 在我的主程序中,第一线

main() {
    FooManager.showFoos();

异常详细信息:

Exception in thread "main" java.util.ConcurrentModificationException
        at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
        at java.util.AbstractList$Itr.next(AbstractList.java:343)
        at com.mytest.FooManager.showFoos(FooManager.java:78)
        at com.mytest.FooTest.main(FooTest.java:109)

Answer 1:

其实,你的内在锁是对你迭代ArrayList中。 看起来无论是FooHandler或print()函数具有参考回你的ArrayList正试图添加/删除内容吧。 根据JAVADOC,此异常,因为无论同一个线程,不同的线程,但并不总是在不同的线程的发生。 所以,如果你有一些种类的操作正在试图修改的ArrayList,那么就会出现这种错误。

尝试使用快速失败的迭代器,以避免这样的错误。



Answer 2:

你不包括大量的代码,但我的猜测是, foo.print正在做一些东西,最终调用到呼叫addFoo (几乎保证了CME的堆栈跟踪既有showFoosaddFoo在里面)。 99个超时100,ConcurrentModificationException的是由单个线程引起的,而不是多线程(尽管混淆名称)。

(是的,这个“错误”是一样的有关CME所有其他SO职位)。



Answer 3:

你可能与其他类的工作,在你的main()使用FooHandler,但你不要在你的问题提供其代码...如果没有,请张贴堆栈跟踪异常这里。



文章来源: java ConcurrentModificationException even with synchronized