Fail Safe Iterator提供不可预测的输出

时间:2017-05-17 23:44:36

标签: iterator concurrenthashmap

我有一个使用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);
    } 
}   

1 个答案:

答案 0 :(得分:0)

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

javadoc for ConcurrentHashMap#keySet()说:

  

视图的迭代器和分裂器一致。

访问包级javadoc of the java.util.concurrent package说:

  

大多数并发Collection实现(包括大多数队列)   也与通常的java.util惯例有所不同   迭代器和分隔符提供弱一致而不是   快速失败遍历

     

他们可以与其他业务同时进行   他们永远不会抛出ConcurrentModificationException   它们可以保证在构造时只存在一次元素,并且可以(但不保证)反映构造后的任何修改

(强调我的)

相关问题