GWT应用程序从MVC模式获取java.util.ConcurrentModificationException

GWT应用程序从MVC模式获取java.util.ConcurrentModificationException,gwt,Gwt,每次遍历我的观察者时,我都会遇到这个错误 @Override public void notifyObservers(ModelViewInterface model) { for(Observer<ModelViewInterface> o : this.observers) o.notify(model); } @覆盖 公共视图(ModelViewInterface模型){ 对于(观察员o:本。观察员) o、 通知(模型); } GWT没有线程,因此它

每次遍历我的观察者时,我都会遇到这个错误

@Override
public void notifyObservers(ModelViewInterface model) {
    for(Observer<ModelViewInterface> o : this.observers)
        o.notify(model);
}
@覆盖
公共视图(ModelViewInterface模型){
对于(观察员o:本。观察员)
o、 通知(模型);
}
GWT没有线程,因此它不是一个同步问题

这似乎是在我按下一个按钮后发生的,有没有关于如何避免此错误的想法?

来自以下的javadoc:

请注意,此异常并不总是表示对象已被其他线程并发修改。如果单个线程发出一系列违反对象约定的方法调用,该对象可能会引发此异常。例如,如果线程在使用fail fast迭代器迭代集合时直接修改集合,迭代器将引发此异常

因此,在您的情况下,
o.notify(model)
似乎直接或间接地修改了
this.observators
。这是修改正在迭代的集合时的常见现象

为了避免并发修改,您可以对集合的副本进行如下操作:

for(Observer<ModelViewInterface> o : 
           new ArrayList<ModelViewInterface>(this.observers)) {

    o.notify(model);
}
用于(观察员o:
新ArrayList(this.observators)){
o、 通知(模型);
}
然而,有时这并不是您想要的-当前
o.notify的行为也可能表明存在错误