fail-fast与fail-safe
Posted yuanfei1110111
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fail-fast与fail-safe相关的知识,希望对你有一定的参考价值。
java.util包下面所有的集合类都是快速失败的,而java.util.concurrent包下面的所有类都是安全失败的。快速失败的迭代器会抛出ConcurrentModificationException,而安全失败的迭代器永远不会抛出这样的异常。
代码示例:
/*
* @desc java集合中Fast-Fail的测试程序。
*
* fast-fail事件产生的条件:当多个线程对Collection进行操作时,若其中某一个线程通过iterator去遍历集合时,该集合的内容被其他线程所改变;则会抛出ConcurrentModificationException异常。
* fast-fail解决办法:通过util.concurrent集合包下的相应类去处理,则不会产生fast-fail事件。
*
* 本例中,分别测试ArrayList和CopyOnWriteArrayList这两种情况。ArrayList会产生fast-fail事件,而CopyOnWriteArrayList不会产生fast-fail事件。
* (01) 使用ArrayList时,会产生fast-fail事件,抛出ConcurrentModificationException异常;定义如下:
* private static List<String> list = new ArrayList<String>();
* (02) 使用时CopyOnWriteArrayList,不会产生fast-fail事件;定义如下:
* private static List<String> list = new CopyOnWriteArrayList<String>();
*
*/
public class Test {
private static List<String> list = new ArrayList<String>();
// private static List<String> list = new CopyOnWriteArrayList<String>();
public static void main(String[] args) {
// 同时启动两个线程对list进行操作!
new ThreadOne().start();
new ThreadTwo().start();
}
private static void printAll() {
System.out.println("");
String value = null;
Iterator iter = list.iterator();
while (iter.hasNext()) {
value = (String) iter.next();
System.out.print(value + ", ");
}
}
/**
* 向list中依次添加0,1,2,3,4,5,每添加一个数之后,就通过printAll()遍历整个list
*/
private static class ThreadOne extends Thread {
public void run() {
int i = 0;
while (i < 6) {
list.add(String.valueOf(i));
printAll();
i++;
}
}
}
/**
* 向list中依次添加10,11,12,13,14,15,每添加一个数之后,就通过printAll()遍历整个list
*/
private static class ThreadTwo extends Thread {
public void run() {
int i = 10;
while (i < 16) {
list.add(String.valueOf(i));
printAll();
i++;
}
}
}
}
fail-fast是一种错误检测机制。它只能被用来检测错误,因为JDK并不能保证fail-fast机制一定会发生。若在多线程环境下使用fail-fast机制的集合,建议使用java.util.concurrent包下的类去替代java.util包下的类,本例中,即将代码:
private static List<String> list = new ArrayList<String>();
替换为:
private static List<String> list = new CopyOnWriteArrayList<String>();
以上是关于fail-fast与fail-safe的主要内容,如果未能解决你的问题,请参考以下文章
Java -- ArrayList扩容机制LinkedList vs ArrayListIterator(Fail-Fast机制Fail-Safe机制)HashMap常见面试题