Multithreading ConcurrentModificationException-多重读取

Multithreading ConcurrentModificationException-多重读取,multithreading,exception,arraylist,concurrentmodification,Multithreading,Exception,Arraylist,Concurrentmodification,我有一个更新系统: new Thread(new Runnable() { @Override public void run() { while (true) { try { Main.frame.onUpdate(); Thread.sleep(50); for (Entity e :

我有一个更新系统:

 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)

我怎样才能解决这个问题呢?

如果我猜对了,在这里
for(实体e:Main.frame.getEntityHandler().getEntities()
是集合“实体”上的迭代。在多线程环境下进行迭代时,如果其他线程修改了“实体”同时,迭代器会捕捉到这一点,并抛出
java.util.ConcurrentModificationException
。一个简单的解决方法是在迭代过程中添加锁,就像下面的
新线程(new Runnable(){
@凌驾
公开募捐{
while(true){
试一试{
Main.frame.onUpdate();
睡眠(50);
同步的{
对于(实体e:Main.frame.getEntityHandler().getEntities()){
e、 onUpdate();
}
}
}捕获(例外e){
e、 printStackTrace();
}
}
}
}).start();

但这会增加额外的性能损失。不确定是否要这样做。

在理解多线程之前,不要使用多线程。