Fail-fast 机制分析

fail-fast 机制介绍

fail-fast(快速失败)机制是集合中比较常见的错误检测机制,防止在对集合进行遍历的时候,出现意料之外的修改,导致意想不到的结果

fail-fast 产生原因

下面通过一个简单的例子分析fail-fast产生的原因

@Test
public void failFastTest(){
    List<String> list = new ArrayList<>();
    list.add("1");
    list.add("2");
    list.add("3");

    Iterator iterator = list.iterator();
	while (iterator.hasNext()) {
		System.out.println(iterator.next());
		list.add("4");
	}
}

代码执行结果

报错信息

通过控制台输出报错信息,可以看到ConcurrentModificationException异常是调用iterator.next()方法的时候跑抛出的,进入到next()方法

public E next() {
    checkForComodification();
    int i = cursor;
    if (i >= size)
        throw new NoSuchElementException();
    Object[] elementData = ArrayList.this.elementData;
    if (i >= elementData.length)
        throw new ConcurrentModificationException();
    cursor = i + 1;
    return (E) elementData[lastRet = i];
}

可以看到next()方法在每次调用的时候,会先调用checkForComdification()方法,进入到checkForComdification()方法

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

代码比较简单,当modCountexpectedModCount不相等的时候,就抛出ConcurrentModficationException异常

modCountArrayList中的一个成员变量,表示的是ArrayList被修改的次数,每次调用ArrayLsitadd(E e)/remove()方法时,modCount++

expectedModCountArrayList中的一个内部类Itr的成员变量,其值是在ArrayList.iterator()方法被调用的时候初始化的,取初始化那一刻的modCount的值。表示的是ArrayList预计被修改的次数

当我们在对ArrayList进行迭代的时候,对集合进行修改,就会产生modeCount != expectedModCount,程序抛出ConcurrentModficationException

fail-fast 更多是在多线程场景下产生的,上面的例子只是为了简单讲解 fail-fast 产生的原因

公众号

扫码关注我,一起学习,一起进步
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值