【问题标题】:LinkedHashMap -> java.util.ConcurrentModificationExceptionLinkedHashMap -> java.util.ConcurrentModificationException
【发布时间】:2020-04-23 04:35:36
【问题描述】:

执行以下代码时出现 ConcurrentModificationException:

    public void refreshAvailableCaseSettings() throws Exception {
        //getAvailableCases() returns reference to the instance variable
        LinkedHashMap<Integer, CaseSetting> cases = getAvailableCases();
        /* java.util.ConcurrentModificationException even after trying entryset()
        for(Map.Entry<Integer, CaseSetting> entry : cases.entrySet()){
            entry.getValue().refresh(false);
        }
        */

        // java.util.ConcurrentModificationException
        Iterator casesIterator = cases.values().iterator();
        while (casesIterator.hasNext()) {
            CaseSetting caseSetting = casesIterator.next();
            //refresh() updates caseSetting state by getting setting info from DB
            caseSetting.refresh(false);
        }
    }

错误:

   java.util.ConcurrentModificationException
    at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:719)
    at java.util.LinkedHashMap$LinkedEntryIterator.next(LinkedHashMap.java:752)
    at java.util.LinkedHashMap$LinkedEntryIterator.next(LinkedHashMap.java:750)

我不会通过添加或删除元素来修改地图。请帮助我理解这里的问题。

【问题讨论】:

  • getAvailableCases(); 从哪里得到它的返回值?是你写的代码吗?看起来getAvailableCases(); 正在返回对从该代码内部某处修改的地图的引用。
  • 你能不能也贴一下 CaseSetting 类..
  • @JerryJeremiah:你是正确的 getAvailableCases() 返回对实例变量的引用。
  • 我不希望 refresh 改变集合 - 我认为它只是更新元素。但是,如果 getAvailableCases() 返回对地图的引用,那么在您尝试刷新地图时,其他一些线程可能正在向地图添加项目。您唯一知道的方法是它是否是您的所有代码。

标签: java linkedhashmap concurrentmodification


【解决方案1】:

使用迭代器的一般约定是这样的:

当对集合的迭代器正在进行时,不得修改底层集合。

你可以对集合的元素做任何你想做的事情,但是你不能碰集合本身

您将获得ConcurrentModificationException,因为您在while 循环中的部分代码正是这样做的——它改变了基础集合。

标准方法是 (a) 创建集合的新副本并迭代此只读副本,或 (b) 将更改放入单独的集合中。

【讨论】:

    【解决方案2】:

    refresh 函数有什么作用?根据我的理解,你得到这些只是因为你在迭代它时修改了HashMap, 我以前在地图上放东西时遇到这些错误,意味着尺寸正在增加。

    您还需要提出所有问题,例如CaseSetting class

    【讨论】:

    • refresh() 函数从数据库中获取 caseSetting 的更新状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 2012-11-28
    • 2011-08-04
    • 2013-05-26
    • 2015-01-14
    相关资源
    最近更新 更多