我有一个使用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
它们保证遍历施工时存在的元素一次,并且可能(但不保证(反映施工后的任何修改。
(强调我的(