我在迭代存储在缓存中的对象时遇到ConcurrentmodificationException。
Controller 代码如下所示:
....
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。
有人知道如何解决这个问题吗?
最佳答案
这意味着对象列表在迭代期间正在更改。 如果出现这种情况,就会发生
- 在您迭代时其他线程修改此集合
- 您可以通过在循环中调用
o.getGetListObjects().remove(lo)
或o.getGetListObjects().add(otherObject)
自行完成此操作。
第二个问题很容易解决。只是不要在迭代期间修改集合或使用 Iterator.remove()
来实现此目的。
第二个问题更难。您应该注意不要在不同的线程中使用相同的集合或对此类操作使用集合安全,例如ConcurrentSkipListSet
。
欢迎您提供有关您的申请的更多详细信息,以获得更好的推荐。
关于java - Playframework 中的 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17527386/