java中的fail-fast(快速失败)机制
简介
fail-fast机制,即快速失败机制,是java集合中的一种错误检测机制。当在迭代集合的过程中对该集合的结构改变是,就有可能会发生fail-fast,即跑出ConcurrentModificationException异常。fail-fast机制并不保证在不同步的修改下一定抛出异常,它只是近最大努力去抛出,所以这种机制一般仅用于检测bug
fail-fast的出现场景
在我们常见的java集合中就可能出现fail-fast机制,比如常见的ArrayList,HashMap.在多线程和单线程环境下都有可能出现快速失败。
1.单线程环境下的fail-fast例子:
public static voidmain(String[] args) {
List list = new ArrayList<>();for (int i = 0 ; i < 10 ; i++) {
list.add(i+ "");
}
Iterator iterator =list.iterator();int i = 0;while(iterator.hasNext()) {if (i == 3) {
list.remove(3);
}
System.out.println(iterator.next());
i++;
}
}
控制台打印:
Exception in thread "main"java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at com.example.springboot_demo.fail_fast_safe.ArrayListFailFast.main(ArrayListFailFast.java:24)
该段代码定义了一个Arraylist集合,并使用迭代器遍历,在遍历过程中,刻意在某一步迭代中remove一个元素,这个时候,就会发生fail-fast
2.多线程环境下
public classArrayListFailFastThreadPool {public static List list = new ArrayList<>();
private static class MyThread1