为什么JDK1.7的HashMap会出现扩容死链

发布时间:2024年01月24日

为什么JDK1.7的HashMap会出现扩容死链?

JDK1.7版本的HashMap在多线程的情况下扩容出现死循环(扩容死链),根本原因是:HashMap在进行扩容时需要进行数据转移,jdk1.7的版本数据转移使用的是头插法(链表的数据从头插入)。

复现分析:

线程一进行扩容,线程一获取到了hashMap中的值,A B(链表顺序)

这时候线程二进行扩容,并且快速完成。 那这时候的HashMap中链表的值应该是B A (B的next 是 A)

线程一继续转移数据,首先先把A这个值插入到链表中,然后再把B的值插入到链表。

这时候因为B的next节点指向A。所以会继续将A插入到链表(也就是将第二位的A提到第一位,这时候的A的next指向B)

B的next 指向A,A的next指向B(B->A->B)。陷入了死链...

所以jdk1.8的HashMap从头插法改成了尾插法
?

图示过程


?

文章来源:https://blog.csdn.net/weixin_65861329/article/details/135833293
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。