针对HashMap的死循环问题,看了网上的多篇文章,明白了问题出现的原因,但网上的文章大都过于细节,后面回顾无法掌握重点。
于是,写这篇文章,简要介绍下自己的理解,方面后面回顾。
现象
CPU使用率飙高,达100%。
使用jstack看线程堆栈,会发现线程阻塞在hashMap的get()方法上。
原因
根本原因:JDK 1.7 HashMap,多线程并发扩容,导致链表构成了环。
详细细节,在这篇文章中讲解的很清楚,疫苗:JAVA HASHMAP的死循环
为什么会构成环?个人理解,其实就是下面两个原因:
1.JDK 1.7 HashMap在扩容进行resize时,将节点从旧的table[i]移动newTable[j]时,使用的是头插法。
2.多个线程并发进行扩容。
那么,上面两个条件结合可能会导致什么问题那?
假设原来在table[i]的链表中,A节点指向了B节点。
在线程1进行扩容时,由于使用了头插法,newTable[j]的链表中B节点指向了A节点。
在线程2进行扩容时,由于使用了头插法,newTable[j]的链表中A节点又指向了B节点。
在线程n进行扩容时,.....