jdk7 HashMap resize 死循环过程详解
java核心api中的HashMap,resize有死循环的风险,这是大家都知道的。具体过程是怎么样的呢?您且别急,听我娓娓道来。先申明,我的讲解,是建立在大家明白HashMap基本原理的基础上。
本人看的是jdk7源码,先上一段jdk7 resize核心源码。请注意看我的代码步骤注释。(请注意我代码注释中的那个假设,我们是要分析resize死循环的场景,所以我直接假设每次重新计算出来的下标不变,实际中也是很可能下标不变的。)

我要阐述的死循环场景,需要三个并发线程,设为线程T1、 线程T2、 线程T3。同时,resize时,设数组下标 i 处有两个节点组成的链表。a->b。
死循环的流程图如下。(注:流程中写的执行1,表示执行代码注释中的1,同理执行2,表示执行代码注释中的2)

注意,线程T1、T2形成环形链表后,本身不会死循环,当线程T3并发resize后,会死循环。
归结死循环的原因,就是resize的算法,将原链表倒转形成新链表,jdk8的算法做了改进,也就避免了死循环。
浙公网安备 33010602011771号