ConcurrentModificationException - multiythreading

时间:2017-07-13 11:17:08

标签: multithreading exception arraylist concurrentmodification

我有一个更新系统:

 new Thread(new Runnable() {
        @Override
        public void run() {
            while (true) {
                try {
                    Main.frame.onUpdate();
                    Thread.sleep(50);
                    for (Entity e : Main.frame.getEntityHandler().getEntities()) {
                        e.onUpdate();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();

有时会产生ConcurrentModificationException。为什么会这样?例外:

java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at de.crade.ki.logic.update.UpdateHandler$1.run(UpdateHandler.java:15)
at java.lang.Thread.run(Thread.java:745)

我该如何解决?

1 个答案:

答案 0 :(得分:0)

如果我猜对了,这里 for (Entity e : Main.frame.getEntityHandler().getEntities()  是集合"实体"的迭代。当你在多线程环境下进行迭代时,如果其他线程修改了"实体"同时,迭代器会捕获它并抛出java.util.ConcurrentModificationException。一个简单的解决方法是在迭代过程中添加锁定,如new Thread(new Runnable() { @Override public void run() { while (true) { try { Main.frame.onUpdate(); Thread.sleep(50); synchronized{ for (Entity e : Main.frame.getEntityHandler().getEntities()) { e.onUpdate(); } } } catch (Exception e) { e.printStackTrace(); } } } }).start(); 但这会增加额外的性能损失。不确定你是否想这样做。