栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

代码演示

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

运行结果




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

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

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

运行结果

 

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/591727.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号