咨询早期版本HashMap中的死循环Bug详情
早期HashMap的死循环Bug详解
触发场景与本质原因
这个Bug仅存在于JDK 7及更早版本的HashMap中,且仅在多线程并发执行扩容操作时会触发:
- 当时
HashMap的扩容逻辑(resize方法)里,会将原数组中的链表节点重新哈希到新数组,采用头插法转移节点——新处理的节点会被放到新链表的头部。 - 多线程环境下,两个线程同时执行扩容操作时,会互相干扰对方的链表节点引用关系,最终导致链表形成环形结构。
引发的问题
当后续调用get方法访问这个环形链表上的元素时,线程会陷入无限循环无法退出,直接导致线程挂起甚至整个应用卡死。
修复方案
JDK 8通过两处关键优化彻底解决了这个问题:
- 扩容时改用尾插法转移链表节点,从根源上避免了多线程下的节点引用错乱。
- 引入红黑树优化过长链表的查询性能(你查到的红黑树相关Bug是另一个独立问题,和本次的死循环Bug无关)。
内容的提问来源于stack exchange,提问作者ng.newbie
相关产品推荐
相关产品推荐

