在这个例子中,混淆了ConcurrentHashMap和HashMap行为之间的区别

E2r*_*abi 3 java java.util.concurrent java-8

我试图了解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);
}
Run Code Online (Sandbox Code Playgroud)

这将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);
}
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*ans 6

这只是其中一个特点ConcurrentHashMap.引用文档:

类似地,Iterators,Spliterators和Enumerations在迭代器/枚举的创建时或之后的某个时刻返回反映哈希表状态的元素.它们不会抛出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); 
Run Code Online (Sandbox Code Playgroud)

  • 为什么不使用`Iterator.remove()`而不是复制整个密钥集?(或清除地图?) (2认同)