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 个特征
减肥的混合果蔬汁(营养果蔬汁窍门)
口腔黏膜病挂什么科看病?治疗难度大吗?
中评现场:境外记者探访西昌卫星发射中心
牛骨髓肽与菊苣多糖对骨髓基质的营养作用
根管治疗后牙医建议做牙冠,有这个必要吗?
青少年近视治疗的方法有哪些?如何有效改善青少年的视力问题?
一颗皮蛋的热量是多少大卡
离婚后如何解决子女教育费用
端午节有关端午节的诗句(精选65句)
‘海马体’是啥意思?
NTR是什么?这种网络流行用语背后的心理解读
材料购进如何填会计凭证
减肥医院开的减肥药有哪些?适用人群和注意事项全解析
探索抚仙湖风光:玉溪至抚仙湖直达旅游大巴车详细指南
云南抚仙湖旅游攻略:探索清澈湖光山色,享受浪漫水岸之旅
每月减重4%最合理,专业人士推荐减肥周期六个阶段
如何分析货币基金的风险与收益?这种分析方法如何帮助做出明智的投资选择?
身份证改名字最新规定是什么?
成人改名字需要什么手续办理流程
如何预期DeepSeek传言中的R2新模型
2024年斗南花卉交易量超140亿枝,从"一枝剑兰"到"一片花海"