抛出java.util.ConcurrentModificationException

时间:2013-12-26 02:22:01

标签: java concurrentmodification

错误日志:

  

[26-12-13 3:16]:java.util.ConcurrentModificationException
  [26-12-13 3:16]:at   java.util.ArrayList中的$ Itr.checkForComodification(ArrayList.java:819)
  [26-12-13 3:16]:at   java.util.ArrayList $ Itr.next(ArrayList.java:791)
[26-12-13 3:16]:     在   server.event.cycle.CycleEventHandler.stopEvents(CycleEventHandler.java:60)   [26-12-13 3:16]:at   server.model.players.Client.logout(Client.java:292)

方法:

public void stopEvents(Object owner) {
    for (CycleEventContainer c : events) {
        if(c.getOwner() == owner) {
            c.stop();
        }
    }
}

问题: 如何解决此错误?

编辑;停止方法:

public void stop() {
    isRunning = false;
    event.stop();
}

这会有用吗?

public void stopEvents(Object owner) {
    ArrayList<CycleEventContainer> garbageEvents = new ArrayList<>();
    for (CycleEventContainer c : events) {
        if(c.getOwner() == owner) {
            garbageEvents.add(c);
        }
    }
    for (CycleEventContainer c: garbageEvents) {
        c.stop();
    }
    garbageEvents.clear();
}

2 个答案:

答案 0 :(得分:0)

每次Collection在迭代时添加或删除任何元素时,都会抛出ConcurrentModificationException。这是为了让迭代Collection的线程知道修改。 因此,我相信您的代码会在其他线程中的其他位置修改事件,因为此处列出的代码似乎不会添加或删除任何元素。你可以看看这个。希望它有所帮助。

答案 1 :(得分:0)

在这种情况下,ConcurrentModificationException意味着另一个线程正在尝试修改events。您需要使用同步或线程安全集合而不是ArrayList。