0

キャッシュに格納されているオブジェクトを繰り返し処理しているときに、ConcurrentmodificationExceptionが発生します。

コントローラーコードは次のようになります。

....
SomeObj o = (SomeObj)Cache.get("obj");
for(listObj lo : o.getGetListObjects()){
    if(lo.getName().equals(name)){
        o.getEventRecipes().remove(lo);         
    }

foreachループが開始されるとすぐに実行がスローされます。同時に明示的に実行されている他のスレッドはありません。

JavaでPlayframework 2.1.1を使用しています。

これを解決する方法を知っている人はいますか?

4

2 に答える 2

3

これは、反復中にオブジェクトのリストが変更されていることを意味します。これは、次の場合に発生する可能性があります

  1. 反復中に他のスレッドがこのコレクションを変更します
  2. o.getGetListObjects().remove(lo)またはo.getGetListObjects().add(otherObject)ループに呼び出して、自分で行います。

2 番目の問題は簡単に修正できます。反復中にコレクションを変更したりIterator.remove()、この目的で使用したりしないでください。

2番目の問題は難しいです。異なるスレッドで同じコレクションを使用したり、そのような操作に対して安全なコレクションを使用したりしないように注意する必要がありますConcurrentSkipListSet

より良い推奨事項を得るために、アプリケーションに関する詳細を提供してください。

于 2013-07-08T13:09:37.913 に答える
1

AlexR が言ったように、 iterator.remove() でイテレータを使用すると問題が解決しました。

コードは次のとおりです。

Iterator<SomeObj> i = e.getSomeObjs.iterator(); 
while(i.hasNext()){
    SomeObj o = i.next();
    if(o.getName().equals(name)){
        i.remove();
    }
}
于 2013-07-08T13:34:10.770 に答える