故障安全迭代器提供不可预测的输出



我有一个使用ConcurrentHashMap的故障安全迭代器的示例(请参阅下面的代码(,其中在迭代时将两个条目添加到映射中。

当其中一个值显示在输出中时,另一个值不会出现在输出中。

由于故障安全适用于地图的副本而不是原始地图,迭代器是否应该在迭代时打印添加到地图的值?

public static void main(String[] args) {
    ConcurrentHashMap<String, Integer> mp = new ConcurrentHashMap<String, Integer>();  
    mp.put("one",1);
    mp.put("two",2);
    Iterator<String> itr=mp.keySet().iterator();
    while (itr.hasNext()) {
        String key=(String)itr.next();
        System.out.println(mp.get(key));
        mp.put("three",3);
        mp.put("FIVE",5);
        System.out.println(mp);
    } 
}   

keySet 迭代器不是故障安全的
您看到的行为与已发布的合同一致。


ConcurrentHashMap#keySet(( 的 javadoc 说:

视图的迭代器和拆分器是一致性的。

访问java.util.concurrent包的包级javadoc说:

大多数

并发集合实现(包括大多数队列( 也与通常的java.util公约不同,因为它们 迭代器和 Spliterator 提供弱一致性,而不是 快速失败遍历

它们可以与其他操作
同时进行 他们永远不会扔ConcurrentModificationException
它们保证遍历施工时存在的元素一次,并且可能(但不保证(反映施工后的任何修改

(强调我的(

最新更新