代码之家  ›  专栏  ›  技术社区  ›  jax

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

gwt
  •  6
  • jax  · 技术社区  · 14 年前

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

    @Override
    public void notifyObservers(ModelViewInterface model) {
        for(Observer<ModelViewInterface> o : this.observers)
            o.notify(model);
    }
    

    GWT没有线程,因此它不是同步问题。

    好像是在我按下一个按钮后,有什么想法可以避免这个错误吗?

    1 回复  |  直到 14 年前
        1
  •  10
  •   Chris Lercher    14 年前

    来自的JavaDoc ConcurrentModificationException :

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

    所以在你看来 o.notify(model) 修改 this.observers -直接或间接。在修改要迭代的集合时,这是一种常见的现象。

    为了避免并发修改,可以这样操作集合的副本:

    for(Observer<ModelViewInterface> o : 
               new ArrayList<ModelViewInterface>(this.observers)) {
    
        o.notify(model);
    }
    

    然而,有时这不是你想要的——当前的行为 o.notify 也可能指示错误。

    推荐文章