迭代ConcurrentHashMap

时间:2014-01-09 16:25:58

标签: java concurrency

我提到了很多关于ConcurrentHashMap迭代器的链接, 比如Is iterating ConcurrentHashMap values thread safe?或Google上的任何其他内容,甚至是java doc,但我在迭代Concurrenthashmap并同时修改它时可能会遇到什么样的行为

2 个答案:

答案 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:

  

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

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