我试图了解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引发异常时删除键吗?谢谢
答案 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);