在此示例中,对ConcurrentHashMap和HashMap行为之间的区别感到困惑

时间:2019-02-18 21:29:53

标签: java java-8 java.util.concurrent

我试图了解ConcurrentHashMap的工作原理。我找到了一个例子,但我听不懂。这是它的代码:

Map<String, Object> myData = new HashMap<String, Object>();
myData.put("A", 1);
myData.put("B", 2);
for (String key : myData.keySet()) {
    myData.remove(key);
}

这将在运行时引发异常ConcurrentModificationException

但是,使用ConcurrentHashMap的这段代码可以正常工作:

Map<String, Object> myData = new ConcurrentHashMap<String, Object>();
myData.put("A", 1);
myData.put("B", 2);
for (String key : myData.keySet()) }
    myData.remove(key);
}

有人可以向我解释为什么ConcurrentHashMap允许在HashMap引发异常时删除键吗?谢谢

1 个答案:

答案 0 :(得分:6)

那只是ConcurrentHashMap的功能之一。引用文档:

  

类似地,迭代器,拆分器和枚举返回元素   反映哈希表在以下时间点或之后的状态   创建迭代器/枚举。他们不扔   ConcurrentModificationException。

但是,

ConcurrentHashMap并不能真正做到这一点来支持您的用例。这样做是为了允许一个线程中的迭代与其他线程中的修改同时发生。

如果这是使用ConcurrentHashMap的唯一原因,那么您可能应该重新考虑一下,因为它比HashMap贵得多。最好像这样使用密钥集之前先对其进行复制:

Map<String, Object> myData = new HashMap<String, Object>();
myData.put("A", 1);
myData.put("B", 2);
for(String key: myData.keySet().toArray(new String[0]))
    myData.remove(key);