猿问

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

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


牧羊人nacy
浏览 92回答 1
1回答

白衣染霜花

这只是 的功能之一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]))&nbsp; &nbsp; myData.remove(key);&nbsp;
随时随地看视频慕课网APP

相关分类

Java
我要回答