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的算法做了改进,也就避免了死循环。

 

       

posted @ 2022-12-07 00:30  天NULL  阅读(142)  评论(0)    收藏  举报