我提到了许多关于ConcurrentHashMap迭代器的链接,比如迭代ConcurrentHashMap值线程安全吗?或者谷歌上的任何其他内容,甚至是java doc,但是我在迭代Concurrenthashmap并同时修改它时可能会面临什么样的行为?
阅读 JavaDoc 以了解ConcurrentHashMap.values():
视图的迭代器 [..] 保证遍历构建迭代器时存在的元素,并且可能(但不保证)反映构建后的任何修改。
如果您对其他迭代器的合同感兴趣,他们也有文档。
是的,与常规地图不同,您可以使用Map.remove(键)迭代ConcurrentHashMap并删除元素.试试这个测试
ConcurrentHashMap<Integer, Integer> m = new ConcurrentHashMap<>();
m.put(1, 1);
m.put(2, 2);
m.put(3, 3);
for (int i : m.keySet()) {
if (i == 2) {
m.remove(i);
}
}
System.out.println(m);
Run Code Online (Sandbox Code Playgroud)
它打印
{1=1, 3=3}
Run Code Online (Sandbox Code Playgroud)