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从头插法改成了尾插法
?
?