0

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

控制器代码如下所示:

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

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

我将Playframework 2.1.1Java一起使用。

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

4

2 回答 2

3

这意味着对象列表在迭代期间正在更改。如果发生这种情况

  1. 其他线程在您迭代时修改此集合
  2. 你通过调用o.getGetListObjects().remove(lo)o.getGetListObjects().add(otherObject)进入你的循环来自己做。

第二个问题很容易解决。只是不要在迭代期间修改集合或Iterator.remove()用于此目的。

第二个问题更难。您应该注意不要在不同的线程中使用相同的集合,或者对此类操作使用安全的集合,例如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 回答