【发布时间】: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