多线程HashMap头插法扩容导致死循环解析

文章讨论了多线程环境下,当两个线程并发操作HashMap的扩容时可能导致的头插法逻辑混乱,形成环状结构。作者分析了问题原因并指出应在新表中正确处理节点移动以避免冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结论:

1.多线程情况下会进行多次扩容,第一次扩容后e与其next位置已经互换,第二次扩容的时候将e放在新的hashmap中后,取next

代码实现如下,注意最后三行

具体分析

对于场景如下,两个线程同时需要扩容,线程2阻塞,线程1先进行。

之后hashmap状态如下

此时线程2苏醒,再次执行扩容

①开始扩容从e2开始,将e2放在新链表上

此时需要获取新的next,即新hashmap中的3是e.next,而3就是next。此时出现问题,本来next需要在原表上,此时却在新表上了。再进行节点移动

这是又移动一次之后,因为需要e= next,所以e此时为3.

第三轮将e.next = newTable[i] 时,出现环状

宏观来说是应该头插法,从头出发,但是多线程会出现后面的节点先出发的情况导致next乱掉了,在新表中,关键操作e = next 和e.next = Table[i]。

参考资料:

JDK7的HashMap头插法循环的问题,这么难理解吗?_哔哩哔哩_bilibili

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值