简介

以下解释摘抄自网络:

在系统设计中,快速失效系统一种可以立即报告任何可能表明故障的情况的系统。快速失效系统通常设计用于停止正常操作,而不是试图继续可能存在缺陷的过程。这种设计通常会在操作中的多个点检查系统的状态,因此可以及早检测到任何故障。快速失败模块的职责是检测错误,然后让系统的下一个最高级别处理错误。

简单点来说就是:快熟失效功能是在 java.util 包中集合的一种失败机制,在多个线程中操作同一个集合时会抛出异常,这种异常是需要停止任务并需要解决的。

源码

在我的 HashMap-源码解读 博客中的 putVal() 方法介绍中有提到一个变量 modCount,与这个变量对应的还有一个变量 expectedModCount,这两个变量一同实现了快速失效机制,这里给出 HashMap 中的 HashIterator 源码(HashMap 中还有很多涉及到这两个变量的源码,拿这个只是方便举例):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
abstract class HashIterator {
Node<K,V> next; // next entry to return
Node<K,V> current; // current entry
int expectedModCount; // for fast-fail
int index; // current slot

HashIterator() {
expectedModCount = modCount;
Node<K,V>[] t = table;
current = next = null;
index = 0;
if (t != null && size > 0) { // advance to first entry
do {} while (index < t.length && (next = t[index++]) == null);
}
}

public final boolean hasNext() {
return next != null;
}

final Node<K,V> nextNode() {
Node<K,V>[] t;
Node<K,V> e = next;
// 这里判断 modCount 和 expectedModCount 是否一致,若不一致就抛出
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
if (e == null)
throw new NoSuchElementException();
if ((next = (current = e).next) == null && (t = table) != null) {
do {} while (index < t.length && (next = t[index++]) == null);
}
return e;
}

public final void remove() {
Node<K,V> p = current;
if (p == null)
throw new IllegalStateException();
// 同上
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
current = null;
K key = p.key;
removeNode(hash(key), key, null, false, false);
expectedModCount = modCount;
}
}

源码中涉及到 nextNode()remove() 的地方都会对 modCount != expectedModCount 进行判断,单线程操作时自然没有问题,当多个线程同时对 HashMap 操作时,一旦调用 putVal() 方法,就会对 modCount 的值进行修改,那就会造成 modCount != expectedModCount 的情况出现,抛出 ConcurrentModificationException 异常,但是不能依赖于这个异常是否抛出而进行并发操作的编程,这个异常只建议用于检测并发修改的bug。

这种机制在 Java 集合包 中都有实现,比如 ArrayList 中,在调用 add() 方法时就会对 modCount 变量进行修改,然后在使用迭代器遍历的时候就会对这两个值进行判断,道理同上。