您的位置:首页 > 大数据 > 人工智能

HashMap迭代过程中fail-fast 机制失败经历!!

2009-03-04 11:09 417 查看
]class Test {
public static void main(String[] args) {

java.util.HashMap<Object,String> map=new java.util.HashMap<Object,String>();
map.put(new Object(), "a");
map.put(new Object(), "b");
java.util.Iterator<Object> it=map.keySet().iterator();
while(it.hasNext()){
it.next();
map.put("", "");
}
System.out.println(map.size());
}
}


上面这段代码运行过程中会抛出java.util.ConcurrentModificationException,这是“Fail Fast”机制在启作用,Collection结构在其返回遍历器(Iterator)后的任何时候发生变化(这种变化不包括遍历器本身调用remove方法移除元素)后,将会导致遍历器抛出异常的机制,保证集合中元素至始至终要保持一至,如果发生改变,就要通知客户端。若将上面代码中 map.put(new Object(), "b");这句注释掉,程序会顺利通过。因为Fail Fast检查只是在 KeyIterator 中的next方法进行,些方法又调用了HashIterator中的nextEntry来返回一个entry。KeyIterator 中的hasNext方法只是进行了return next != null;这一句来判断是否有下一个entry。问题就出现在这里,如果原来Iterator中只有一个entry,在第一次迭代过程中对它进行了修改后,hasNext返回false结束了迭代过程,netx方法中的“Fail Fast”机制检查没有执行到,所以程序会安全通过。本例简单化了使用情景,一般是在多线程环境中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: