假设我的类中有两个方法writeToMap()
和processKey()
,并且这两个方法都由多个线程调用。 writeToMap
是一种在hashmap中编写内容的方法,processKey()
用于根据keySet
的{{1}}执行某事。
在processKey中,我首先在获取密钥集之前复制HashMap
。
originalMap
但即使我总是复制hashmap,我仍然得到new HashMap<String, Map<String,String>(originalMap).get("xx").keySet();
。问题是什么?
答案 0 :(得分:3)
HashMap的复制构造函数在正在复制的地图上执行(隐藏)iteration(originalMap)。如果在此迭代进行过程中,另一个线程修改了originalMap,则可能会出现ConcurrentModificationException。
答案 1 :(得分:2)
您有嵌套地图,并且在从内部地图获取内部地图之前,您正在复制外部地图。请注意,内部地图尚未复制,因此当您对其进行迭代时,您仍然使用共享数据结构。
很难说基于简短的代码片段,但我认为你不需要复制外部地图,而你确实需要复制内部地图。