hashmap的并发修改异常

时间:2014-05-28 09:59:20

标签: java hashmap concurrenthashmap

Map<String, Map<Long, String>> regions = Service.getWhseByRegions();
for(String region:regions.keySet()){
warehouseList=getAuthorizedWarehouse(dashboardWarhs,regions.get(region));
if(warehouseList!=null && warehouseList.size()>0){
      regions.put(region, warehouseList);
}else{
      regions.remove(region);
}
}

嗨,我收到ConcurrentModificationException,请帮忙

3 个答案:

答案 0 :(得分:1)

你得到ConcurrentModificationException,因为你在迭代收集时删除了元素。使用Java 8的removeIf()方法或安全Iterator#remove()进行删除。

答案 1 :(得分:0)

您正在迭代Map并尝试修改相同的Map。而是使用临时的重复Map进行循环内的操作,然后分配回循环外的原始Map。

答案 2 :(得分:0)

这是一个经典错误:-) 你应该考虑两件事

  1. 您无法更改当前正在迭代的集合
  2. 可能有多个线程处理getWhseByRegion()返回的集合
  3. 第一个: 存储所有已识别的项目,这些项目应在不同的集合中删除,而不是删除 迭代要删除的项目,并为每个项目调用删除

    第二个: 尝试防止并发访问。 很可能你可以添加一些同步到你的方法或同步(lockObjektForWhse){...}