LinkedHashMap->;java.util.ConcurrentModificationException
执行以下代码时,我收到ConcurrentModificationException:LinkedHashMap->;java.util.ConcurrentModificationException,java,linkedhashmap,concurrentmodification,Java,Linkedhashmap,Concurrentmodification,执行以下代码时,我收到ConcurrentModificationException: public void refreshAvailableCaseSettings() throws Exception { //getAvailableCases() returns reference to the instance variable LinkedHashMap<Integer, CaseSetting> cases = getAvaila
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);
}
}
我不是通过添加或删除元素来修改地图。请帮助我理解这里的问题。刷新功能是什么?据我所知,您之所以获得这些,只是因为您在迭代时修改了HashMap
,
当我在地图上放东西的时候,经常会出现这些错误,这意味着尺寸在增加
您还需要对所有内容提出疑问,例如caseseting
class使用迭代器的一般合同如下:
当集合上的迭代器正在进行时,不能修改基础集合
可以对集合的元素执行任何操作,但不能触摸集合本身
您将获得一个ConcurrentModificationException
,因为循环中的一部分代码正是这样做的,它更改了基础集合
标准方法是(A)创建集合的新副本并在该只读副本上迭代,或(b)将更改放入单独的集合。Where dogetAvailableCases()代码>获取其返回值?是你写的代码吗?它看起来像getAvailableCases()
正在返回对映射的引用,该映射是从该代码中的某个地方修改的。您是否也可以发布CaseSetting类..@JerryJeremiah:您是正确的getAvailableCases()返回对实例变量的引用。我不希望refresh更改集合-我认为它只是更新了元素。但是,如果getAvailableCases()返回对映射的引用,则在您尝试刷新映射时,其他线程可能正在向映射添加项目。唯一可以知道的方法是,它的所有代码。refresh()函数从数据库获取caseSetting的更新状态。
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)