我正在使用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
答案 0 :(得分:2)
这里的问题是,当使用keySet().iterator()
时,尤其是文档的这一部分,您不了解弱一致性迭代器的含义:
保证它们遍历完构造时存在的元素一次,并且可以(但不保证)反映出构造后的任何修改。
想象一下这样的情况:您正在迭代ConcurrentHashMap
并打印任何内容。一旦看到某个存储桶并显示了所有元素,就移至下一个存储桶,并更新(假设您向其中添加了key-value
对)。尽管确实存在,但不会显示对前一个的更新。
循环后,您可以执行以下操作:
System.out.println(map);
看到所有东西都存在了。