主要原因:
1.JDK 1.7 HashMap在扩容进行resize时,将节点从旧的table[i]移动newTable[j]时,使用的是头插法。
2.多个线程并发进行扩容。
详细原因:
可以参考这篇博客 java关于HashMap多线程扩容导致死循环(JDK1.7)的详细过程
首先我们需要明确的问题点出在哪个方法中,transfer() 正是它扩容的真正方法,而问题也出现此位于源码:
put() # addEntry() #resize()# transfer

举例
在线程1进行扩容时,由于使用了头插法,newTable[j]的链表中B节点指向了A节点。
在线程2进行扩容时,由于使用了头插法,newTable[j]的链表中A节点又指向了B节点。
在线程n进行扩容时,…
这就容易出现问题了。。在并发扩容结束后,可能导致A节点指向了B节点,B节点指向了A节点,链表中便有了环!!!

结果:
中…(img-4zJB6ksp-1662690082848)]
结果:
当我们取去遍历集合时,因为此时链表成环,所以遍历就会死循环,所以就出问题了。