迭代ConcurrentHashMap

Cha*_*dra 4 java concurrency

我提到了许多关于ConcurrentHashMap迭代器的链接,比如迭代ConcurrentHashMap值线程安全吗?或者谷歌上的任何其他内容,甚至是java doc,但是我在迭代Concurrenthashmap并同时修改它时可能会面临什么样的行为?

Mar*_*sch 6

阅读 JavaDoc 以了解ConcurrentHashMap.values()

视图的迭代器 [..] 保证遍历构建迭代器时存在的元素,并且可能(但不保证)反映构建后的任何修改。

如果您对其他迭代器的合同感兴趣,他们也有文档。


Evg*_*eev 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);
Run Code Online (Sandbox Code Playgroud)

它打印

{1=1, 3=3}
Run Code Online (Sandbox Code Playgroud)