快速失败(fail-fast)和安全失败(fail-safe)

快速失败:在java.util包下的集合类都是快速失败的,具体说就是在我们采用迭代器遍历集合元素时, 这时又在对集合加入数据,这是就会抛出ConcurrentModificationException异常。

代码演示

Map<String,Integer> map = new HashMap<>();
        map.put("张三",18);
        map.put("李四",20);
        map.put("王五",19);
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator();
        while (iterator.hasNext()){
            Map.Entry<String, Integer> next = iterator.next();
            //往集合中添加数据
            map.put("小明",18);
            System.out.println("姓名:"+next.getKey()+"    "+"年纪:"+next.getValue());
        }

运行结果




原因:在遍历集合的数据过程中,或有一个变量modCount指向下一个位置的的数据。在java.util包下的集合中,如果在遍历数据时,添加了新的元素在集合中,那么此时的modCount的值就会发生变化,在下一次遍历时,发现并不是所期待的数据位置,就会抛出ConcurrentModificationException异常

安全失败:在java.util.Concurrent包下的集合类都是安全失败,具体说就是在我们采用迭代器遍历集合元素时这是集合中加入数据不会抛出异常,正常执行。
代码演示

 Map<String,Integer> map = new ConcurrentHashMap<>();
        map.put("张三",18);
        map.put("李四",20);
        map.put("王五",19);
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator();
        while (iterator.hasNext()){
            Map.Entry<String, Integer> next = iterator.next();
            //往集合中添加数据
            //map.put("小明",18);
            System.out.println("姓名:"+next.getKey()+"    "+"年纪:"+next.getValue());
        }

运行结果

 

原因:在遍历集合的数据过程中,也有一个变量modCount指向下一个位置的,java.util.Concurrent包下的集合类,在遍历集合中的数据时,会把集合中的数据复制下来,然后遍历复制的数据,此时不管是否往集合中添加数据都不会影响最后的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值