博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java学习笔记(40)——Java集合12之fail-fast
阅读量:5720 次
发布时间:2019-06-18

本文共 2745 字,大约阅读时间需要 9 分钟。

  hot3.png

一、fail-fast概述

“快速失败”也就是fail-fast,它是Java集合的一种错误检测机制。当多个线程对集合进行结构上的改变的操作时,有可能会产生fail-fast机制。记住是有可能,而不是一定。例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。

在详细介绍fail-fast机制的原理之前,先通过一个示例来认识fail-fast。

示例代码:(FastFailTest.java)

import java.util.*;import java.util.concurrent.*;/* * @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
 list = new ArrayList
(); *   (02) 使用时CopyOnWriteArrayList,不会产生fast-fail事件;定义如下: *            private static List
 list = new CopyOnWriteArrayList
(); * * @author skywang */public class FastFailTest {    private static List
 list = new ArrayList
();    //private static List
 list = new CopyOnWriteArrayList
();    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++;            }        }    }}

运行结果

 运行该代码,抛出异常java.util.ConcurrentModificationException!即,产生fail-fast事件!

结果说明

(01) FastFailTest中通过 new ThreadOne().start() 和 new ThreadTwo().start() 同时启动两个线程去操作list。
    ThreadOne线程:向list中依次添加0,1,2,3,4,5。每添加一个数之后,就通过printAll()遍历整个list。
    ThreadTwo线程:向list中依次添加10,11,12,13,14,15。每添加一个数之后,就通过printAll()遍历整个list。
(02) 当某一个线程遍历list的过程中,list的内容被另外一个线程所改变了;就会抛出ConcurrentModificationException异常,产生fail-fast事件。

二、fail-fast解决方案

fail-fast机制,是一种错误检测机制。它只能被用来检测错误,因为JDK并不保证fail-fast机制一定会发生。若在多线程环境下使用fail-fast机制的集合,建议使用“java.util.concurrent包下的类”去取代“java.util包下的类”。

所以,本例中只需要将ArrayList替换成java.util.concurrent包下对应的类即可。
即,将代码

private static List
 list = new ArrayList
();

替换为

private static List
 list = new ArrayList
();

则可以解决该办法。

转载于:https://my.oschina.net/jewill/blog/411916

你可能感兴趣的文章
zfs raidz结构详解
查看>>
hpp头文件与h头文件的区别
查看>>
C#中常见的winform控件命名规范
查看>>
吃瓜笔记 | 旷视研究院解读Light-Head R-CNN:平衡精准度和速度
查看>>
Redis 3.0 Cluster集群配置
查看>>
彩票的数据可视化
查看>>
js将json数据以csv格式下载
查看>>
MegaCli 监控raid状态
查看>>
Express调用mssql驱动公共类dbHelper
查看>>
剖析 HTTP 协议
查看>>
Azure SQL Database (20) 使用SQL Server 2016 Upgrade Advisor
查看>>
事务隔离级别神话与误解
查看>>
Hadoop - 任务调度系统比较
查看>>
100个高质量Java开发者博客
查看>>
Web服务初探:用Demo学Web服务系列(3)——用C/S程序调用Web服务
查看>>
使用PhoneGap开启移动开发之旅
查看>>
Windows Azure Web Site (7) Web Site配置
查看>>
解读jQuery中extend函数
查看>>
设备树网址【原创笔记】
查看>>
Windows 10 IoT Serials 1 - 针对Minnow Board MAX的Windows 10 IoT开发环境搭建
查看>>