HashMap死循环主要是指JDK7中,HashMap扩容时采用头插法。如果在多线程情况下,2条线程同时进行扩容操作,会造成两个结点的next指针互相指向对方的情况
比如最简单的一个情况,一个链表只有A、B两个结点,线程1和线程2一开始都指向A结点
A
↓
B
线程1扩容时,会在新数组中颠倒链表的原顺序,变为
B
↓
A
此时线程1已经完成了扩容,B是头结点,B.next = A
。但是线程2并不知道,所以线程2又要从A开始进行一番操作,把A.next
修改为B,这样就会形成一个死循环
在JDK8中,扩容已经由头插法改为尾插法,多线程情况下虽然不会造成死循环,但是会造成操作的重复执行。多线程推荐使用ConcurrentHashMap