美文网首页
hashMap的循环链表形成

hashMap的循环链表形成

作者: 7d972d5e05e8 | 来源:发表于2019-11-17 22:19 被阅读0次

原文地址:https://www.cnblogs.com/tilamisu007/p/9438356.html

1、 当前hashmap的状态如下,有两个线程同时对它扩容。

image.png

2、 假设线程1先开始扩容,遍历tab[0]的链表,按照链表的先后顺序进行rehash。假设A和B节点,恰好又在同一个tab元素里面。线程1对A节点rehash结束后,读取A节点next节点是B。这个时候,线程1正好被中断。如下:

image.png

当前线程正在处理B节点,但是还尚未加入tab中。

3、线程1暂停后,线程2开始,并且先完成扩容。如下:

image.png

线程2正常且先完成扩容。把它赋值给了原来的hashMap的tab数组了。

4、这个时候线程1被唤醒了,继续步骤2,对节点B继续扩容。把B节点插入tab[0]位置,并且把B.next = A。这步完成后,就和步骤3一模一样。老的B节点next本来是null的,但是线程2扩容后,B的next是A节点。线程1就以为还没扩容完,继续对A进行扩容。当执行A节点的时候,发现tab[0]的链表结尾已经是A了。那么就把这个节点提升到该链表的表头。即把A.next = tab[0]。而这个时候的tab[0]就是B。变成了如下:

image.png

ps:扩容的时候,会重跑一遍老的hashmap,对节点进行重新插入。而插入节点是直接插入到链表头部。所以,第四步中的A节点,虽然已经在链表尾部了,但是由于多线程的原因,又插入了一遍A,把它提升到链表头部了。形成了循环。

相关文章

  • HashMap,LinkedHashMap简析及LruCache

    简介 HashMap:数组+单向链表 LinkedHashMap: HashMap + 双向循环链表 LruCac...

  • hashMap的循环链表形成

    原文地址:https://www.cnblogs.com/tilamisu007/p/9438356.html 1...

  • ConcurrentHashMap源码解析

    1.HashMap HashMap的ReHash在线程并发情况下会形成链表环。想要避免HashMap的线程安全问题...

  • 单向循环链表

    单向循环链表 循环链表顾名思义就是链表是循环的,最后一个节点的next指向首元节点,从而形成一个环.如图 单向循环...

  • Java源码分析-LinkedHashMap

    LinkedHashMap继承自HashMap,同时也维护了元素的插入顺序。内部多了一个双向循环链表的维护,该链表...

  • 理解ConcurrentHashMap的实现原理

    HashMap的并发问题 Java7 在Java7上,HashMap扩容Rehash的过程中,可能出现循环链表导致...

  • 线性表(四)——循环链表

    循环链表 构造原理 循环链表是指链表中最后那个链结点的指针域存放指向链表最前面那个结点的指针,整个链表形成一个环。...

  • 循环链表

    1. 创建循环链表 循环链表的创建实际就是单向链表的尾节点指向头结点,最终形成一个环。 2. 输出所有节点 3. ...

  • 数据结构与算法-循环链表

    1. 创建循环链表 循环链表的创建实际就是单向链表的尾节点指向头结点,最终形成一个环。 2. 输出所有节点 3. ...

  • 数据结构与算法-单向循环链表

    循环链表:将单链表中终端结点的指针域由空改成指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链...

网友评论

      本文标题:hashMap的循环链表形成

      本文链接:https://www.haomeiwen.com/subject/sdymictx.html