Java集合:使用故障安全迭代器更新地图

时间:2018-10-06 12:09:20

标签: java collections

我正在使用Maps分析故障安全迭代器,并验证(如果我们要更新密钥集)操作是否会在克隆或实际Map上发生

private static void failSafeIterator() {
    ConcurrentHashMap<String, String> map=new ConcurrentHashMap<>();
    map.put("a", "one");
    map.put("b", "two");
    Iterator<String> keyIterator=map.keySet().iterator();
    while(keyIterator.hasNext()){
        String key=keyIterator.next();
        System.out.println(key+":"+map.get(key));
        map.put("c", "three");
        map.put("q", "four");
        map.put("W", "five");

    }
    System.out.println(map.get("q"));

}

根据上述代码段

  

c,q和w的加法应该在克隆而不是在克隆上发生   实际收藏

但是我可以看到集合中正在发生更新。

输出也有些混乱,因为即使键存在于映射中,也不是所有键值对都已打印。

输出:

a:one 
b:two
c:three
W:five
four

1 个答案:

答案 0 :(得分:2)

这里的问题是,当使用keySet().iterator()时,尤其是文档的这一部分,您不了解弱一致性迭代器的含义:

  

保证它们遍历完构造时存在的元素一次,并且可以(但不保证)反映出构造后的任何修改。

想象一下这样的情况:您正在迭代ConcurrentHashMap并打印任何内容。一旦看到某个存储桶并显示了所有元素,就移至下一个存储桶,并更新(假设您向其中添加了key-value对)。尽管确实存在,但不会显示对前一个的更新。

循环后,您可以执行以下操作:

System.out.println(map);

看到所有东西都存在了。