我有一个使用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);
}
}
答案 0 :(得分:0)
keySet迭代器不是故障安全 您看到的行为与已发布的合同一致。
javadoc for ConcurrentHashMap#keySet()说:
视图的迭代器和分裂器弱一致。
访问包级javadoc of the java.util.concurrent
package说:
大多数并发Collection实现(包括大多数队列) 也与通常的
java.util
惯例有所不同 迭代器和分隔符提供弱一致而不是 快速失败遍历:他们可以与其他业务同时进行 他们永远不会抛出
ConcurrentModificationException
它们可以保证在构造时只存在一次元素,并且可以(但不保证)反映构造后的任何修改。
(强调我的)