java - Playframework 中的 ConcurrentModificationException

标签 java playframework-2.1 concurrentmodification

我在迭代存储在缓存中的对象时遇到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.1Java

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

最佳答案

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

  1. 在您迭代时其他线程修改此集合
  2. 您可以通过在循环中调用 o.getGetListObjects().remove(lo)o.getGetListObjects().add(otherObject) 自行完成此操作。

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

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

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

关于java - Playframework 中的 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17527386/

相关文章:

java - 将 MySql 中两个表的数据导入 Android 应用程序

java - 如何在不同的 Activity 中使用相同的 ArrayList(Android 和 Java)

java - 知道为什么我在从 HashMap 中删除键时没有收到 java.util.ConcurrentModificationException 吗?

java - 如何跳过 block 中的任何错误并继续下一个 block 项目?

java - 测试用例后使用SQL回滚,但被测方法使用commit

java - 在 HTTP 401 后重复 Play Framework WS 异步调用

playframework - 在 Windows 上 Play Framework 制作

playframework - 是否可以通过 RequireJS 强制 Play Framework 将所有 js 文件编译为一个文件?

java - 在 Java 中,如何在单线程程序中抛出 ConcurrentModificationException?

java - 为什么当新变量改变时,原来的变量也会改变?