【Java面试高频-集合】Java集合中的快速失败机制fail-fast和fail-safe是怎么样的?
发布日期:2021-06-29 15:36:44
浏览次数:2
分类:技术文章
本文共 1615 字,大约阅读时间需要 5 分钟。
Java集合的快速失败机制fail-fast和fail-safe?
fail-fast机制
在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了(增加、删除),会抛出Concrrent Modification Eception。
原理:迭代器在遍历过程中直接访问集合中的元素,并且在遍历过程中使用一个modCount变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hasNext/next遍历下一个元素时,都会检测modCount是否为expectedmodCOunt值,是的话就返回遍历;否则抛出异常,终止遍历。
public static void main(String[] args) { Listlist = new ArrayList<>(); for (int i = 0 ; i < 10 ; i++ ) { list.add(i + ""); } Iterator iterator = list.iterator(); int i = 0 ; while(iterator.hasNext()) { if (i == 3) { list.remove(3); } System.out.println(iterator.next()); i ++; }public static void main(String[] args) { HashMap map = new HashMap<>(); map.put("1",1); map.put("2",2); map.put("3",3); map.put("4",4); Iterator > iteratormmap = map.entrySet().iterator(); System.out.println(map.toString()); int i=0; while(iteratormmap.hasNext()){ if(++i==1){ System.out.println("执行修改");// map.put("1",5); map.put("5",5); //修改了结构 抛ConcurrentModificationException } System.out.println(iteratormmap.next()); } System.out.println(map.toString()); }
场景:java.util包下的集合类都是快速失败的,不能在多线程下并发修改。(迭代过程中被修改。)
fail-safe
采用安全失败机制的集合容器,在遍历时不是直接在集合内容访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。类似于CopyOnWriteArray集合。
在java.util.concurrent包下的容器并没有使用modCount之类的来保证并发修改。而是通过加锁来实现对“写写”的解决,以及对copyonwrite即COW技术来实现对读写的解决。
转载地址:https://codingchaozhang.blog.csdn.net/article/details/116736669 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年04月28日 19时44分15秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
ubuntu 16:使用系统自带的中文输入法
2019-04-29
k8s单机版[ microk8s ]
2019-04-29
docker系列6 :k8s集群[ 解压安装 ]
2019-04-29
maven- idea: 打包可执行jar
2019-04-29
docker系列2: windows安装docker
2019-04-29
hbase数据转移: 导入导出
2019-04-29
docker系列7: docker搭建mysql
2019-04-29
windows server 2012设置远程连接断开后自动注销
2019-04-29
python基础:list,map,open()文件读写
2019-04-29
Go面向对象-接口
2019-04-29
Go-多路选择和超时控制
2019-04-29
Go-channel的关闭和广播
2019-04-29
Go-任务的取消
2019-04-29
AIX 作为Web Server 使用时,tcp相关的几个参数调整
2019-04-29
自我学习37:请描述一下网页从开始请求到最后展示的完整过程
2019-04-29
自我学习38:如何区分前后端BUG
2019-04-29
自我学习39:接口自动化测试用例&功能测试用例区别
2019-04-29
mirror去兔子补丁下载 附安装教程
2019-04-29
mirror去兔子补丁 v3.0附安装教程
2019-04-29
mirror去兔子补丁为什么还有兔子_mirror去兔子补丁使用教程
2019-04-29