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版本的这个问题在当前版本中已经得到解决,但理解这些问题的根源有助于我们更好地掌握数据结构和多线程编程的原理。
热门推荐
三个月大小狗饮食指南:从食材到喂养的全方位指导
为啥打喷嚏喷出来的口水,比吐出来的口水臭好几倍?
Gaussian-LIC:首个多传感器融合3DGS-SLAM系统(浙大&TUM)
如何通过学习和实践提高投资技能
中国到葡萄牙飞多久?航线时长与旅行建议详解
上海“出行即服务”(MaaS)系统赋能空铁联运,旅客虹桥枢纽中转出行更顺畅
陕西西安2026年起减少中考计分科目
正确表扬和鼓励孩子的话,如何有效地表扬和鼓励孩子
轻松识别真假黄金:实用技巧与趣闻解析
银行的贵金属产品如何鉴定真伪?
父亲血战湘江数日成“幸存者”,儿子奔波23年追寻红色足迹
3楼、7楼、10楼、17楼不建议买?过来人:后期问题很难解决
为什么潮汕人、浙江人、福建人都很善于赚钱?
免予追究刑事责任是否构罪
空调制热为什么比制冷声音大?原因分析与解决方案
《肖申克的救赎》:一部超越时代的自由颂歌
初秋季节降燥润肺止咳的中成药是什么
在职博士招生简章中的校企合作如何?
吸烟的危害,你真的了解吗?牢记这3点,可降低风险!
中国第一经济大省GDP达1.93万亿美元,美国第一经济大省呢?
蒙脱石混悬液的功效与作用是什么
生活百科丨脱鞋=生化武器?这些鞋子除味小技巧注意了!
运动鞋怎么除臭
做一个乐观的悲观主义者
在古代当尼姑还有门槛?只有贵族女子才行?
审判卷宗副卷页码顺延的探讨与规范化建议
无数次匍匐爬行!验船师是一个怎样的职业?
“实践大使”项目发布中国消化内镜检查现状调研结果,提出肠道准备质量优化路径
CSS修改iframe下的样式
中式logo设计合集:国潮来袭,古风新韵!