Playframework中的ConcurrentModificationException

时间:2013-07-08 13:03:49

标签: java playframework-2.1 concurrentmodification

我在迭代存储在缓存中的对象时得到 ConcurrentmodificationException

Controllercode如下所示:

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

一旦foreach循环开始,执行就会被抛出。没有其他线程同时显式运行。

我正在使用 Playframework 2.1.1 Java

有没有人知道如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

这意味着在迭代期间正在更改对象列表。 如果

,就会发生这种情况
  1. 其他线程在您迭代时修改此集合
  2. 您可以通过调用o.getGetListObjects().remove(lo)o.getGetListObjects().add(otherObject)进入循环来自行完成。
  3. 第二个问题很容易解决。只是不要在迭代期间修改集合或为此目的使用Iterator.remove()

    第二个问题更难。您应该注意不要在不同的线程中使用相同的集合,或者使用安全集合来进行此类操作,例如: ConcurrentSkipListSet

    欢迎您提供有关申请的更多详细信息,以获得更好的建议。

答案 1 :(得分:1)

正如AlexR所说,使用迭代器和iterator.remove()解决了这个问题。

以下是代码:

Iterator<SomeObj> i = e.getSomeObjs.iterator(); 
while(i.hasNext()){
    SomeObj o = i.next();
    if(o.getName().equals(name)){
        i.remove();
    }
}