我在迭代存储在缓存中的对象时得到 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 。
有没有人知道如何解决这个问题?
答案 0 :(得分:3)
这意味着在迭代期间正在更改对象列表。 如果
,就会发生这种情况o.getGetListObjects().remove(lo)
或o.getGetListObjects().add(otherObject)
进入循环来自行完成。 第二个问题很容易解决。只是不要在迭代期间修改集合或为此目的使用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();
}
}