最新要闻
- 每日观察!三星手机工业设计要焕然一新了!前奔驰中国首席大牛加盟:全权操刀
- 世界短讯!全新红旗H6亮相2022广州国际车展:压垮合资中型轿车又一力作
- B站跨年晚会节目单官宣:邓紫棋首唱《三体》片尾曲《面壁者》
- 提前加满 2023开年油价第一涨:预计每升多花0.21元
- 员工超54万!京东为一线员工薪酬福利开支超330亿元
- 搭配紫光展锐国产芯:微软新Surface RT预计明年夏季推出
- 环球视讯!魅友人物纪录片《我有一个朋友》首映 80后CEO龚昕:我的青春是魅族
- 世界实时:搭乘猎鹰9号火箭 韩国首个月球探测器成功入轨:位列世界第七
- 【新视野】《王者荣耀》2023年首个新版本定了:新英雄莱西全员免费得
- 焦点观察:3.0T V6发动机卖成白菜价 长城皮卡山海炮上市:22.88万起
- 鲁大师12月新机性能/流畅榜发布:小米直接包揽性能榜前三!
- 【环球时快讯】面包车行驶中车内起火 突然爆炸车顶掀飞数米高
- 【环球新要闻】大礼包抄底价:良品铺子坚果礼盒1440g装49元
- 80后宝妈辞职后做沙滩代写:月入过万
- JJJJ车厘子有多大?JJJJ车厘子价格是多少?
- 狱警十七在第几集出现的?狱警十七为什么杀小朵?
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
焦点速讯:Java集合快速失败和安全失败机制
快速失败机制
是Java集合的一种错误检测机制,当遍历集合时,集合的结构进行了修改,可能会触发"fail-fast"机制
Java.util包中所有集合都被设计为快速失败机制
(资料图片仅供参考)
示例代码
public class TestFailFast { public static void main(String[] args) { testFailFastBySingleThread();// testFailFastByMultiThread(); } // 单线程测试快速失败机制 private static void testFailFastBySingleThread() { HashMaphashMap =new LinkedHashMap<>(); hashMap.put("1","a"); hashMap.put("2","b"); hashMap.put("3","c"); Iterator > iterator=hashMap.entrySet().iterator(); while (iterator.hasNext()) { hashMap.put("4","d"); System.out.println(iterator.next()); } } // 多线程测试快速失败机制 private static void testFailFastByMultiThread() { List list = new ArrayList(); list.add("基础元素"); String listStr = JSONArray.toJSONString(list); System.out.println("主线程list集合:" + listStr); Thread threadOne = new Thread(new AddRunnable(list), "线程一"); Thread threadTwo = new Thread(new RemoveRunnable(list), "线程二"); threadOne.start(); threadTwo.start(); }}class AddRunnable implements Runnable { private List list; public AddRunnable(List list) { this.list = list; } @Override public void run() { System.out.println("线程一开始"); for (int i = 0; i < 10; i++) { list.add(i + ":线程一"); } String listOne = JSONArray.toJSONString(list); System.out.println("线程一list集合:" + listOne); }}class RemoveRunnable implements Runnable { private List list; public RemoveRunnable(List list) { this.list = list; } @Override public void run() { System.out.println("线程二开始"); while (list.iterator().hasNext()) { String str = list.iterator().next(); list.remove(str); } String listOne = JSONArray.toJSONString(list); System.out.println("线程二list集合:" + listOne); }}
执行testFailFastBySingleThread(),运行结果:
Exception in thread "main" java.util.ConcurrentModificationException at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:719) at java.util.LinkedHashMap$LinkedEntryIterator.next(LinkedHashMap.java:752) at java.util.LinkedHashMap$LinkedEntryIterator.next(LinkedHashMap.java:750) at com.zyuan.boot.Java封装类.Collection.TestList.testFailFastBySingleThread(TestList.java:33) at com.zyuan.boot.Java封装类.Collection.TestList.main(TestList.java:11)
执行testFailFastByMultiThread(),运行结果:
主线程list集合:["基础元素"]线程一开始线程二开始线程一list集合:["基础元素","0:线程一","1:线程一","2:线程一","3:线程一","4:线程一","5:线程一","6:线程一","7:线程一","8:线程一","9:线程一"]Exception in thread "线程二" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909) at java.util.ArrayList$Itr.next(ArrayList.java:859) at com.zyuan.boot.Java封装类.Collection.RemoveRunnable.run(TestList.java:69) at java.lang.Thread.run(Thread.java:748)
报错分析
可以发现示例代码运行都抛出了异常:ConcurrentModificationException,这个就是"fail-fast"机制
因为线程一通过循环不断修改集合结构,而线程二则是通过iterator遍历集合,在集合的iterator调用.next()方法时,会进行检测,代码如下:
int expectedModCount = modCount;public E next() { checkForComodification(); int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i];}final void checkForComodification() { // 比较modCount和expectedModCount是否相同,不相同则抛出异常 if (modCount != expectedModCount) throw new ConcurrentModificationException();}
modCount:记录集合的修改次数,也就是add、remove等操作的次数记录,由transient修饰符修饰
在AbstractList里面被定义,其子类可以继承并使用
protected transient int modCount = 0;
而创建iterator的时候,expectedModCount会获取到modCount的值,因此都是相同的
但是如果不相同(一般是modCount > expectedModCount),就说明有其他线程进行了集合结构修改操作
所以抛出异常告知集合已经发生改变
安全失败机制
遍历集合时,不直接在集合内容上访问,而是copy原有集合内容,在copy的集合中遍历,称为"fail-safe"机制
java.util.concurrent包中所有集合都被设计为安全失败机制
代码和结果
public class TestFailSafe { public static void main(String[] args) { ConcurrentHashMapconcurrentHashMap = new ConcurrentHashMap (); concurrentHashMap.put("1","a"); concurrentHashMap.put("2","b"); concurrentHashMap.put("3","c"); Iterator > iterator = concurrentHashMap.entrySet().iterator(); while (iterator.hasNext()) { concurrentHashMap.put("4", "d"); System.out.println(iterator.next()); } }}
执行结果:
1=a2=b3=c4=d
可以看到是没有抛出任何异常的
原理
ConcurrentHashMap:
public final Map.Entrynext() { Node p; if ((p = next) == null) throw new NoSuchElementException(); K k = p.key; V v = p.val; lastReturned = p; advance(); return new MapEntry (k, v, map);}final Node advance() { Node e; if ((e = next) != null) e = e.next; for (;;) { Node [] t; int i, n; // must use locals in checks if (e != null) return next = e; if (baseIndex >= baseLimit || (t = tab) == null || (n = t.length) <= (i = index) || i < 0) return next = null; if ((e = tabAt(t, i)) != null && e.hash < 0) { if (e instanceof ForwardingNode) { tab = ((ForwardingNode )e).nextTable; e = null; pushState(t, i, n); continue; } else if (e instanceof TreeBin) e = ((TreeBin )e).first; else e = null; } if (stack != null) recoverState(n); else if ((index = i + baseSize) >= n) index = ++baseIndex; // visit upper slots if present }}
可以看到ConcurrentHashMap中的next()方法,做了当前对象拷贝的处理
焦点速讯:Java集合快速失败和安全失败机制
全球新消息丨Python教程:如何创建多线程?
Django与数据库连接
每日观察!三星手机工业设计要焕然一新了!前奔驰中国首席大牛加盟:全权操刀
世界短讯!全新红旗H6亮相2022广州国际车展:压垮合资中型轿车又一力作
B站跨年晚会节目单官宣:邓紫棋首唱《三体》片尾曲《面壁者》
焦点热讯:Kafka的终极UI工具丨Offset Explorer功能简介
提前加满 2023开年油价第一涨:预计每升多花0.21元
员工超54万!京东为一线员工薪酬福利开支超330亿元
搭配紫光展锐国产芯:微软新Surface RT预计明年夏季推出
MyBatis-ResultMap
环球视讯!魅友人物纪录片《我有一个朋友》首映 80后CEO龚昕:我的青春是魅族
世界实时:搭乘猎鹰9号火箭 韩国首个月球探测器成功入轨:位列世界第七
【新视野】《王者荣耀》2023年首个新版本定了:新英雄莱西全员免费得
焦点观察:3.0T V6发动机卖成白菜价 长城皮卡山海炮上市:22.88万起
AIRIOT答疑第3期|如何使用物联网平台的可视化组态引擎?
鲁大师12月新机性能/流畅榜发布:小米直接包揽性能榜前三!
【环球时快讯】面包车行驶中车内起火 突然爆炸车顶掀飞数米高
【环球新要闻】大礼包抄底价:良品铺子坚果礼盒1440g装49元
80后宝妈辞职后做沙滩代写:月入过万
JJJJ车厘子有多大?JJJJ车厘子价格是多少?
狱警十七在第几集出现的?狱警十七为什么杀小朵?
锰钢是什么材质的钢材?锰钢板价格多少钱一吨?
泳镜防雾剂怎么使用?游泳镜防雾剂对眼睛的伤害有哪些?
四大满贯赛事是哪些?四大满贯赛事场地类型包括哪些?
西元年是什么意思?西元年和公元年换算表
雪肌精MYV系列产品适合什么肤质?雪肌精MYV系列产品介绍
八仙过海的八仙是哪八仙?八仙过海大结局是什么?
穷兵黩武是什么意思?穷兵黩武打一生肖是什么?
接口自动化测试不想写代码?这款工具强烈推荐
当前时讯:CloudCanal对Online DDL 工具 GH-OST 和 PT-OSC 的支持
【全球新视野】手撕fft算法--fft原理和源码解析
母猪上树是什么意思?母猪上树是什么生肖动物?
变频空调制热一小时多少度电?变频空调和定频空调的区别
三星i9250是什么型号?三星i9250手机参数
金山毒霸和360卫士哪个好?金山毒霸有必要安装吗?
英雄联盟adc是什么意思?英雄联盟adc全部英雄图鉴
半导体激光器的工作原理是什么?半导体激光器的优缺点
今日热闻!理想官方详解为何L9、L8备受欢迎:全世界最先进的增程电动系统
资讯推荐:和苹果iPhone 14一样薄!vivo S16e首销:2099元起
没有科技与狠活 0添加配料表超干净!汇源果汁大促:24.8元2L
169元拿下Wi-Fi 6路由器!荣耀路由X4 Pro首销:可达1500Mbps
世界微资讯!官方剧透理想L7关键细节:皇后座后排超越豪华D级车
世界资讯:【爬虫实战项目】Python爬虫批量下载网易云音乐飙升榜并保存本地(附源码)
世界看热讯:分布式、集群、微服务、微前端、负载均衡的概念
精彩看点:苹果为延长iPhone 14 Pro灵动岛面板使用寿命!要求三星用喷墨打印密封工艺
当前热点-女子放生2.5万斤鲇鱼被起诉:偏肉食动物 入侵能力极强
天天热推荐:不愧电动爹?零下25度暴风雪中的特斯拉Model 3:电池预热45分钟后才充上电
每日快报!mini LED和LCD将要拜拜了 iPad Pro未来会升级OLED屏
能跑1200公里 长城魏牌六座旗舰SUV正式亮相:前脸大改!
关系型数据库 和 非关系型数据库
2022年这5款熟悉的产品向我们告别 太可惜了
全球快播:Lightning再见!第二大手机国印度强推USB-C接口:iPhone必须换
天天滚动:Epic今年终极一送:好评如潮游戏《羞辱》免费领!省173块
全球热推荐:纯钛杯身!小米米家保温杯Ti首批卖光了:30小时众筹金额破50万元
SSD也没人买了?未来三年增速下滑:降价吸引力也不大
世界微资讯!暴雪仍没找到人接盘!《魔兽世界》等国服将停止 网易称服务到最后一刻
世界快资讯丨博客园图片问题
环球快看点丨iPhone 15系列差异化加大:iPhone 15 Plus或大降价
全球信息:我注册B站3736天了!还记得10年前的小破站什么样吗?
每日观察!一年一度的进口游戏版号来了 这次有不少“硬货”!
要闻:威马汽车拿到四川的救命钱!但负面缠身的它还能活过来吗?
简讯:航空工业AS700民用飞艇02架首飞成功:可载9人、能飞10小时
回归童年的美好 守住童年的回忆 那些年你玩过的游戏都有呢
mysql之索引
游戏免费送 折扣超Steam Epic的冬季特卖属实有点暴力了
全球讯息:网信办通报173款APP:正“偷窥”你的隐私 赶紧卸载
速递!Python 面向对象进阶
最资讯丨10 个你需要熟悉的 CSS3 属性
当前滚动:广西现大型金属残骸 现场升起火苗:原来是火箭助推器
天天观天下!Codeforces 1336 F Journey 题解
每日精选:马斯克SpaceX公司副总裁私人飞机冲出跑道 网友:人身安全警告?
报道:浙江多地下雪 2023年第一股冷空气来了
2万多的日本水晶椅看着太像刑具:屁股瑟瑟发抖
世界动态:2023年最受期待的十款国产游戏 《黑神话:悟空》位列第一
当前头条:FreeSWITCH给Say模块增加中文语音
全球微头条丨12核Zen4又降价了 AMD锐龙9 7900X到手3259元(首发4299)
观察:小米送福利!MIX Fold 2用户花1分钱可领399元保护壳
热资讯!仍由腾讯代理!《CF》开发商新作《命运方舟》国服官宣:2023年上线
【热闻】周鸿祎:360现在的对手不再是国内同行
苹果手表血氧监测功能被指有种族偏见 在美国被告上法庭
Fiddler V5.0 英文/汉化 Windows 抓包工具 【12月29日亲测有效】
RX 7900危了 消息称RTX 4070 Ti显卡降价700元:性价比大增
当前焦点!卡丁车手比赛撞柱身亡 主办方回应:赛道由专业设计师设计
天天微资讯!Doge表情包原型柴犬患白血病和肝病:情况糟糕、生命危险
环球看热讯:明星带货表演砍价被调侃演技巅峰上热搜:律师喊话先涨再降涉嫌价格欺诈
比亚迪大屏立功 中国乘用车仪表盘平均尺寸将增至近10英寸
世界微资讯!AMD、NV让你失望了!2023年显卡价格仍将居高不下 降价希望渺茫
【天天快播报】骨折价没人要!首架波音747-8宣告报废:才飞了不到30小时
《阿凡达2》成2022全球票房亚军!仅次于《壮志凌云2》
世界通讯!今年春节乐趣不限量!PICO 4新春礼盒成年货新选择
如何选购云服务器
终极.NET混淆器丨.NET Reactor产品介绍
linux跟踪技术之ebpf
天天快报!AcWing246. 区间最大公约数
【世界独家】30层楼高、叶轮直径191米!国内单机容量最大高原山地风机成功吊装
全球今头条!19999元!铁威马发布12盘位NAS T12-450:总容量可达240TB
羊了个羊创始人没想到一季度挣了20万:公司仅7人参保
焦点速递!俞敏洪最想读的三本书:《道德经》《红楼梦》《金瓶梅》
Cubase11安装破解图文教程 【2022年12月29日亲测有效】