【问题标题】:java.util.ConcurrentModificationException thrown抛出 java.util.ConcurrentModificationException
【发布时间】:2014-01-13 17:33:57
【问题描述】:

错误日志:

[26-12-13 3:16]:java.util.ConcurrentModificationException
[26-12-13 3:16]:在 java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
[26-12-13 3:16]:在 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]:在 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();
}

【问题讨论】:

  • events 是否在发生在 c.stop()、c.getOwner() 或不同线程中的其他任何地方发生更改?
  • ...或被删除?
  • ConcurrentModificationException 当迭代器下的数据结构在迭代器迭代时发生变化时抛出。我的猜测是 c.stop() 正在做一些改变 events 的事情(例如,从 events 中删除 c)导致此异常。
  • 是的,那我应该使用哪种方法?
  • 通常您不使用直接迭代器,或者您将要删除的内容收集到列表中,并在迭代完成后批量删除。至少这是我通常看到的方法。

标签: java concurrentmodification


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-18
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      相关资源
      最近更新 更多