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的行为也可能表明存在错误