码迷,mamicode.com
首页 > 其他好文 > 详细

fail-fast与fail-safe

时间:2018-12-26 20:58:39      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:ati   ica   fail   value   one   while   str   快速   run   

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

标签:ati   ica   fail   value   one   while   str   快速   run   

原文地址:https://www.cnblogs.com/yuanfei1110111/p/10181613.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!