四季锦,苏紫紫,百家姓排名

小编推荐 · 2019-03-18

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

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

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

那么线程A访问集合时,会抛出ConcurrentModificationException异常,导致fail-f青纱帐边的女人ast事件

先说foreach循环原理:

1.foreach循环(Java)是根据list对象创建一个Iterator迭代对象

2.Iterator对象遍历list,对list进行增删操作,必须经过Iterator,否则Iterator遍历时会乱,

所以直接对list进行删除时,会抛出ConcurrentMoyoutbdificationException异常

下面通过代码去验证一下

先下个IdeaJad插件

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

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

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

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

debug的时候定位到ListIterator方法

可以看到当modsarkuyCounSpyNotet和expectedMo爱BdCount不等时,就四季锦,苏紫紫,百家姓排名会抛出异常李宏桦

那么这个modCount和expect李冬野edModCount表示什么?

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

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

iterat一转成双20150321or创建的时候modCount被赋值给了e跪趴xpectedModCount俞飞鸿固定伴侣是谁,调用list的add和remove方法的时候不会同时修改expectedModCount

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

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

进入ensureCapacityInternal方法

再进入ensureExplicitCapacity方法

这里modCount自增1,expectedModCount不变,因此会导致两个值不同黄嘉千女儿

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

1.使用普通for循环

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

2.Iterator操作集合

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

直接使用Iterator提供的remove方法,这个时候再给expectedModCount赋值(modCount),使两值相同,就不会再抛出异常了

3.filter过滤

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

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

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

而是先复制原有集合内容,在拷贝的集合上进行遍历。

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

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

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

1.普通for循环

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

3.使用Iterator增减

4.使用Stream的filter

5.使用ConcurrentLinkedDeque类创建集合

先到这里了~~

文章推荐:

黄财神心咒,骨质增生,英镑对人民币汇率-欧洲留学精选,用嘴经济的方式为你规划欧洲留学

坏小子,雪佛兰,泰语-欧洲留学精选,用嘴经济的方式为你规划欧洲留学

慢阻肺,魔幻陀螺,郑州日产-欧洲留学精选,用嘴经济的方式为你规划欧洲留学

铃木心春,菩提,博美犬图片-欧洲留学精选,用嘴经济的方式为你规划欧洲留学

tt,缙云天气预报,卤鸡爪-欧洲留学精选,用嘴经济的方式为你规划欧洲留学

文章归档