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抛出异常时删除键吗?谢谢
这只是其中一个特点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)
| 归档时间: |
|
| 查看次数: |
74 次 |
| 最近记录: |