Java HashMap中的ConcurentModificationException

时间:2012-12-13 04:25:15

标签: java concurrency thread-safety hashmap

假设我的类中有两个方法writeToMap()processKey(),并且这两个方法都由多个线程调用。 writeToMap是一种在hashmap中编写内容的方法,processKey()用于根据keySet的{​​{1}}执行某事。

在processKey中,我首先在获取密钥集之前复制HashMap

originalMap

但即使我总是复制hashmap,我仍然得到new HashMap<String, Map<String,String>(originalMap).get("xx").keySet(); 。问题是什么?

2 个答案:

答案 0 :(得分:3)

HashMap的复制构造函数在正在复制的地图上执行(隐藏)iteration(originalMap)。如果在此迭代进行过程中,另一个线程修改了originalMap,则可能会出现ConcurrentModificationException。

答案 1 :(得分:2)

您有嵌套地图,并且在从内部地图获取内部地图之前,您正在复制外部地图。请注意,内部地图尚未复制,因此当您对其进行迭代时,您仍然使用共享数据结构。

很难说基于简短的代码片段,但我认为你不需要复制外部地图,而你确实需要复制内部地图。