首页 > 其他 > 详细

fail-fast以及Iterator对象

时间:2020-06-25 13:46:11      阅读:57      评论:0      收藏:0      [点我收藏+]

Iterator对象在foreach循环的时候只能使用自己的remove/add方法,如果使用了集合的remove/add方法或者其他线程并发时修改了集合的内容,就属于fail-fast机制,即是一个错误,但是该错误会尽最大可能地抛出ConcurrentModificationException异常,该异常应尽量作为一个bug的检测。

public class Test1 {
public static void main(String[] args) {
List<String> ls=new ArrayList<String>();
ls.add("Bob");
ls.add("Jia");
for(Iterator it=ls.iterator();it.hasNext();) {//这里的Iterator对象是一个List对象的另一种形式,头指针不包含元素,只包含头指针。每次的next方法都会输出下一个元素。
if ("Bob".equals(it.next())) {//这里会得到"Bob"。
ls.remove(0);//这里使用ls来移除或添加,那么操作过后总长度是变了的,会和Iterator对象长度不符,因此调用Iterator对象的next等方法会抛出Concurrent...异常。
System.out.println(it.next());//所以这里会抛出异常,不管是ls移除任意位置索引。除非Iterator调用自身方法移除队头元素即用it来移除就是remove()方法无参数,表示移除。

//但是如果把上述调用it.next()给注释掉,就不会抛出异常。当没有用hasNext来检验时,调用next()方法可能该元素不存在,会抛出NoSuchElementException异常。

//如果是并发操作,记得给Iterator对象上锁哦。

}
}
}

fail-fast以及Iterator对象

原文:https://www.cnblogs.com/riverer/p/qqq321.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!