中英互译,王牌御史漫画,itunes备份文件在哪

admin 8个月前 ( 03-18 03:03 ) 0条评论
摘要: 当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了。...

这节来聊聊foreach循环进行元素增删,是如何违反了fail-fast规则的

fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件

例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;

那么线程A访问集合时,会抛出ConcurrentModificationException异常,导致fail-fast事件

先说foreach循环原理:

1.foreach循环(Java天幕红尘改编的电视剧)是根据list对象创建一个Iterator迭代对象

2.Iterator对象遍历list,对list进行增删操作,必须经过Ite中英互译,王牌御史漫画,itunes备份文件在哪rator金箍棒传奇3完整版,否则It娜琦丽erator遍历时会乱,

所以直接对list进行删除时,会抛出ConcurrentModific访客机一体机ationException异常

下面通过代码去验证一下

先下个IdeaJad插件

反编译(Decompiled)上文的foreach循环的class文件,可得

这段代码不出所料,还是会抛出异常

每次foreach迭代的时候都有两步操作:
1. iterator.hasNext() //判断是否有下个元素
2. item = iterator.next() //下个元素是什么,并赋值给上面例子中的item变量

那究竟是程黎芬哪个方法出的问题呢,可以先设置三个断点

debug的时候定位到ListIterator方法

可以看到当modC综影视闻说ount和expectedMo邹继富dCount不等时,就会抛出异常

那么这个modCount和expectedModCount表示什么?

modCount:ArrayList中的一个成员变量,表示list对象从创建(new)到当前被修改的次数,当调用List的add或者remove方法的时候,modCount都会增加

expectedModCount:ArrayList中的一个内部类Iterator的成员变量,现在期刘桢梁甫行原文望这个list被修改的次数是多少次

iterator创建的时候modCount被赋值给小川美了expectedModCount,调用list的add和remove方法的时候不会同时修改expectedModCount

这样就导致下次取值时检查到两个值不等,从而导致异常

看看调用add方法的时候发生了什么(remove同理):

进入ensureCapacityInternal方法

再进入ensureExplicitCapacity方法

这里modCount自增1,expectedModCount不变,因此会导致两个值不同

那么怎么解决这个问题呢,下面的方法可以解决你的烦恼

1.使胡歌的老婆王晓晨用普通for循环

这个上文已经讲过了,普通for循环没用到Iterator的遍历,因此没有fail-fas艾培拉t的检验,此处不再赘述

2.Iterator操作集合

除了直接使用普通for循环以外,直接使用Iterator提供的remove方法

直接使用601601商城Iterator提供的remove方法,这个时候再给expectedMo迦梨之歌dCount赋值(modCoun烈玉锵t),使两值相同,就不项羽帐下五大将会再抛出异常了

3.filter过滤

Java 8中filter过滤属性,把集合转换成流,对于流有一种filter操作,通过测试的元素被留下来生成一个新 Stream

在Java中除了一些普通的集合类以外,还有一些采用了fail-safe机制的集合类。

这样的集合容器在遍历时不是直接在集合内容上访问的,

而是先鲸头鹤复制原有集合内容,在拷贝的集合逆杀神魔古立亚上进行遍历。

由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发ConcurrentModificationException。

5.只啊宾增删一个元素,加break,代码不会执行下一次next()

总结一下,如果遇到需要循环中增删元素的情况,可以采用以下方案:

1.普通for循环

2.foreach循环里面只调用一次remove/add方法,加个break中止循环

3.使用Iterator增减

4.使用Stream的filter

5.使用ConcurrentLinkedDeque类创建集合

先到这里了~~

文章版权及转载声明:

作者:admin本文地址:http://e-cliche.com/articles/382.html发布于 8个月前 ( 03-18 03:03 )
文章转载或复制请以超链接形式并注明出处e-创立新车,电动汽车,新能源汽车