java 集合fail-fast机制

fail-fast  快速失败机制,其实就是当 你在使用增强for循环去遍历某些集合的同时去对他们进行增删操作,而这种操作是有缺陷的,可能引起出现bug,那么系统便觉得没用必要再继续执行下去了,便抛出ConcurrentModificationException异常,进行快速失败。 

具体原因是 在使用增强for的时候,底层实际上是使用 迭代器进行循环的。

当我们在使用迭代器的next()方法去获取元素时 ,它会调用checkForComodification()方法

final void checkForComodification() {
    if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
}

expectedModCount 是iterator中的一个成员变量,而iterator是ArrayList的一个内部类,当ArrayList调用iterator()方法获取一个迭代器时,会创建一个iterator,并且将expectedModCount 初始化为modCount的值。只有该迭代器修改了集合,expectedModCount 才会修改。

那么当去对集合进行增删操作时,会将 modcount的值++,就会触发checkForComodification()方法中的if判断,抛出异常。

那么如何避免这种情况呢?

 1.  我们可以使用普通for循环去遍历集合,但是这种操作可能会跳过某些元素,因为当前面的元素被移除出集合中后,后面的元素会向前移动,导致跳过元素。

2.   那么解决元素向前移动的问题即可,因此我们可以用for循环倒序遍历集合就不会出现元素移动的现象了。

3.  还可以调用迭代器本身的remove方法去操作元素,因为迭代器的remove方法也会改变expectedmodCount的值,那么也不会触发fail-fast

4.  然后使用copyonwrite 集合,copyonwrite 在进行增删操作的时候会复制的数组中添加或删除元素,进行了读写分离,不会对集合本身的origin array造成影响,因此当然也不会有fail-fast了。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值