Java Collection中的fast-fail机制

参考自:http://www.cnblogs.com/skywang12345/p/3308762.html

  • fail-fast 定义

fail-fast(快速失败)机制:是Java集合中的一种检错机制。

当某个线程用iterator对list进行遍历时,其他线程同时并发的对list进行插入或者删除等操作,使得list产生了结构性的变化(结构性变化是指:list的size被改变的一些变化),就会抛出ConcurrentModificationException,产生fail-fast行为。注意,只有add,remove,clear等操作能使得list的size发生改变,而set等操作没有使得list的size产生变化,因此,只有前者的相关操作可以使得list产生结构性的变化。

举个例子:当线程A正在用iterator遍历list时,线程B同时并发的向list中插入了元素,使得list产生了结构性的改变,就会产生fail-fast行为,抛出ConcurrentModificationException。

  • fail-fast 原理

fail-fast的原理基于两个变量 modCountexpectedModCount ,首先介绍一下modCount变量:

在AbstractList中定义了一个非static的全局变量modCount(一个对象拥有一个该变量),AbstractList的子类自然也会拥有自己的modCount,比如:ArrayList,LinkedList,Vector等都是该类的子类。当某个集合产生了结构性的变化时,该集合所持有的modCount就会加一

接下来是expectedModCount变量:

expectedModCount变量是定义在每个子类的内部类ListIterator中的,定义时就用modCount值对其初始化了,且整个过程中不改变其值,即在整个过程中,expectedModCount的值一直是起初modCount的值。该变量的作用就是存储刚用iterator遍历时的modCount值。

fail-fast的原理:

在调用iterator中的next(),previous()等方法时,首先会去比较一下当前modCount和expectedModCount值,如果这两个值不相等,说明:在遍历期间,有其他线程修改了正在遍历的这个集合,并使得该集合产生了结构性的变化。(因为expectedModCount初始化时是赋了modCount的值,如果集合没有产生结构性的变化,modCount的值就不会变,那么这两个变量的值应该是相等才对)。故,这个时候就该抛ConcurrentModificationException异常,产生了fail-fast行为。

猜你喜欢

转载自blog.csdn.net/weixin_41734200/article/details/80581965