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的主要内容,如果未能解决你的问题,请参考以下文章

「Fail-Fast与Fail-Safe机制」

fail-fast与fail-safe

fail-fast和fail-safe的区别

Java -- ArrayList扩容机制LinkedList vs ArrayListIterator(Fail-Fast机制Fail-Safe机制)HashMap常见面试题

Java集合三fail-fast

[转载] fail-fast总结(通过ArrayList来说明fail-fast的原理解决办法)