Java的快速失败和安全失败
一:快速失败(fail—fast)
在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。
原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历。
注意:这里异常的抛出条件是检测到 modCount!=expectedmodCount 这个条件。如果集合发生变化时修改modCount值刚好又设置为了expectedmodCount值,则异常不会抛出。因此,不能依赖于这个异常是否抛出而进行并发操作的编程,这个异常只建议用于检测并发修改的bug。
场景:java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)。
二:安全失败(fail—safe)
采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。
原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发Concurrent Modification Exception。
缺点:基于拷贝内容的优点是避免了Concurrent Modification Exception,但同样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。
场景:java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改。
本文来自云栖社区合作伙伴“开源中国”
本文作者:狼王黄师傅

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
史上最全人工智能进阶干货
给大家看一组最新数据。 2018年最新数据:python、大数据、人工智能从业者薪资表 为什么人工智能行业的工资那么高? 无论是科研院所,商业巨头还是初创企业,各行各业都在大力开发或者引进人工智能,由于储备不足,导致人工智能人才现在出现缺口,而且非常巨大。 据领英今日发布的全球AI领域技术人才分布图显示,中国目前的AI人才缺口超过5万人。 人才供不应求,导致领域岗位的薪资也自然水涨船高。 很多人,尤其是应届毕业生和刚参加工作的程序员们,都想在这股 AI 热潮中,凭借实力和简历脱颖而出。然而,很多人在第一关就被 HR 刷掉了,更别说技术面了。 想必大家都知道原因。 目前的人工智能,对于本科生来说并没有深入的AI专业,毕竟这些方向属于高层次的知识,需要一定的基础。虽然由于现在AI热还有工业界对于这方面人才的强烈需求,开始有大学专门开设了AI和数据科学专业。 但是,这些学生毕业出来后所拥有的技能和企业所需的人才标准却是不对等的。 像BAT的人工智能部门;高校人工智能研究相关工作;明星创业公司,比如四小龙,商汤,矿世,科大等。如果你只学过计算机专业,想进入这些公司或者机构并没那么简单,因为你没...
- 下一篇
我如何零基础转行成为一个自信的前端
来自未来的补充:原标题是“学前端,我如何在一年内学到三年的知识”。经网友批评和自己反思后,决定改一个合适点的标题。另外,有不少朋友以为我在国外,其实我一直在深圳。目前我也在想进入技术好一点的团队,可打杂。 这个大言不惭的标题源自我与我所认识的前端从业者的比较,也源自别人的评价。读者也可以看我其它文章,评估我的专业能力。当然我不是在每个领域都能匹配别人三年的实践经验。我还有很多技术栈没掌握,比如没写过小程序,没用过 jQuery(这个也不想再学了,只是依然还有用人单位在要求)。也有很多坑没踩过,比如没有做过浏览器兼容(说实话也不太想兼容 IE,浪费生命)。我想说的是我对 JS 这门语言以及 CS 这门学科掌握的深度,前端生态圈理解和熟悉的程度,以及知识迁移能力。 我不是想炫耀自己多牛,而是想帮助和我有相似背景的人。我在掘金发了几篇文章后,有几个朋友在知道我零基础学编程一年半就进步这么快后,想知道我是怎么学的。这篇文章就是对他们的详细回答。 一、背景介绍 我本科学的是国际贸易,乱选的专业。毕业后做了半年外贸,实在不喜欢,然后去做英文编辑了。第二份工作也很无聊,就是写英文软文,发表在国外的行...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Linux系统CentOS6、CentOS7手动修改IP地址