我提到了很多关于ConcurrentHashMap迭代器的链接, 比如Is iterating ConcurrentHashMap values thread safe?或Google上的任何其他内容,甚至是java doc,但我在迭代Concurrenthashmap并同时修改它时可能会遇到什么样的行为
答案 0 :(得分:6)
是的,与常规地图不同,您可以使用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);
打印
{1=1, 3=3}
答案 1 :(得分:4)
阅读ConcurrentHashMap.values()
的JavaDoc:
视图的迭代器[..]保证遍历构造迭代器时存在的元素,并且可能(但不保证)反映构造之后的任何修改。
如果您对其他迭代器的合同感兴趣,他们也有文档。