HashMap1.7版本扩容时的死循环问题详解
创作时间:
作者:
@小白创作中心
HashMap1.7版本扩容时的死循环问题详解
引用
1
来源
1.
https://www.cnblogs.com/blogzero/p/18232672
HashMap是Java中非常重要的数据结构之一,在不同版本中针对多线程环境下的性能和安全性进行了多次优化。本文将通过代码分析和图解的方式,详细讲解HashMap1.7版本在多线程环境下扩容时使用头插法可能导致的死循环问题,并对比1.8版本中采用尾插法的改进。
1. 概述
在HashMap1.7版本中,扩容时采用的是头插法转移节点。在多线程并发的情况下,这种做法可能会导致链表死循环的问题。而在HashMap1.8版本中,这个问题通过改用尾插法得到了解决。
2. 问题分析
假设有两个线程,线程1和线程2,同时对HashMap进行put操作并触发了扩容。下面是扩容时节点转移的关键代码:
void transfer(Entry[] newTable) {
Entry[] src = table;
int newCapacity = newTable.length;
for (int j = 0; j < src.length; j++) {
Entry<K,V> e = src[j];
if (e != null) {//两个线程都先进入if
src[j] = null;
do {
Entry<K,V> next = e.next;
int i = indexFor(e.hash, newCapacity);
e.next = newTable[i]; //线程1 这里还没执行 停下
newTable[i] = e;
e = next;
} while (e != null);
}
}
}
线程1和线程2都进入if语句后,线程1在上述代码注释的地方暂停。此时的变量指针状态如下图所示:
线程2获得CPU资源并继续执行:
- 线程2执行完第一轮循环后:
- 线程2执行完第二轮循环后:
此时线程2暂停,轮到线程1继续执行。由于线程1中E变量指向a节点,next变量指向b节点,所以:
线程1继续执行被中断的代码:
void transfer(Entry[] newTable) {
Entry[] src = table;
int newCapacity = newTable.length;
for (int j = 0; j < src.length; j++) {
Entry<K,V> e = src[j];
if (e != null) {//两个线程都先进入if
src[j] = null;
do {
Entry<K,V> next = e.next;
int i = indexFor(e.hash, newCapacity);
e.next = newTable[i]; //线程1刚才在这里停下,所以现在从这一句代码开始执行
newTable[i] = e;
e = next;
} while (e != null);
}
}
}
执行完之后,链表结构变为:
此时,a节点的next指针指向了自己,形成了一个死循环。
3. 解决方案
在HashMap1.8版本中,通过改用尾插法解决了这个问题。尾插法确保了在多线程环境下,即使有线程切换,也不会导致链表结构的破坏。
总结
通过这个例子,我们可以看到HashMap在不同版本中的优化历程。虽然HashMap1.7版本的这个问题在当前版本中已经得到解决,但理解这些问题的根源有助于我们更好地掌握数据结构和多线程编程的原理。
热门推荐
春节健康吃饺子:科学搭配大揭秘!
大厨亲授:10种完美饺子馅的调制秘诀
海鲜控必试:虾仁豆腐&蟹肉饺子新吃法!
男性疏肝理气的中成药
疏肝理气应该吃什么中成药
麦肯中国发布《关于中国摩登家庭的真相》本土文化洞察白皮书
生态环境部公布第三批美丽河湖优秀案例
药酒:药效与酒劲的双重考量
AI医学影像诊断:未来医生的新助手?
糙米与精米:营养价值的深度较量
欧洲战斗机计划:台风战斗机带动四国经济增长
欧洲“台风”战斗机换装Captor-E雷达,性能大升级!
台风 vs 阵风:谁是欧洲最强战机?
智慧医疗中的AI伦理挑战:数据安全、算法透明与责任归属
纽约大学最新研究:AI医疗面临重大安全威胁!
过欠压保护器:保障设备安全的守护者
霍尔果斯口岸:丝绸之路上的“钢铁驼队”跑出加速度
霍尔果斯口岸:外向型经济新高地
霍尔果斯口岸:中欧班列的新丝路传奇
幽门螺杆菌新疗法:逆转胃肠化生,降低胃癌风险
肠化生患者饮食指南:这些食物要当心!
AI赋能公共卫生管理:机遇与挑战并存
智慧医疗:AI如何重塑未来健康?
一人得流感,身边人如何防感染?“保姆级”家庭预防攻略来了!正确处理分泌物很关键
别乱吃!板蓝根不防病,也不是万能感冒药,这些情况不适用……
从太昊陵到霍尔果斯:探寻丝路古迹的文化之旅
赛里木湖水上乐园:打卡网红景点,畅享水上乐趣!
赛里木湖冬日奇景:冰花、冰泡、冰馕全攻略
新质职场:00后如何玩转灵活就业?
回锅肉的家常做法,好吃不油腻,开胃下饭