java ConcurrentModificationException even with synchronized

白昼怎懂夜的黑 提交于 2019-12-11 07:24:44

问题


Similar issue has been posted before but this case is different - there is static usage which may be the complicating it. Just want to see if anyone has ideas on how to handle this. I get the ConcurrentModificationException even though I am using synchronzed on the list around both blocks that modify it.

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

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

(I have mutliple similar classes 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();
            }
    }
}

I declare ABC1, ABC2, ABC3 etc in more than 1 thread func. In my main program, first line

main() {
    FooManager.showFoos();

Exception details:

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)

回答1:


Actually, your intrinsic lock is on the ArrayList that you are iterating. Looks like either the FooHandler OR the print() function has a reference back to your ArrayList which is trying to add/remove content to it. According to JAVADOC, this exception can happen because of either the same thread or a different thread, but not always a different thread. So, if you have some kind of operation that is trying to modify your Arraylist, then this error can occur.

try to use fail-fast iterators for avoiding such errors.




回答2:


You don't include a lot of code, but my guess is that foo.print is doing something which is ultimately invoking a call to addFoo (pretty much guarantee that the stacktrace for the CME has both showFoos and addFoo in it). 99 times out of 100, ConcurrentModificationException is caused by a single thread, not multiple threads (despite the confusing name).

(and yes, this "bug" is the same as all the other SO posts about CME).




回答3:


You probably work with other class, in your main() you use FooHandler, but you don't provide its code in your question... If it is not, please post stack trace for the exception here.



来源:https://stackoverflow.com/questions/19164796/java-concurrentmodificationexception-even-with-synchronized

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!