HashMap中Jdk1.7的多线程并发出现死循环原因

HashMap中Jdk1.7的多线程并发出现死循环原因

主要原因:

1.JDK 1.7 HashMap在扩容进行resize时,将节点从旧的table[i]移动newTable[j]时,使用的是头插法。

2.多个线程并发进行扩容。

详细原因:

可以参考这篇博客 java关于HashMap多线程扩容导致死循环(JDK1.7)的详细过程

一、背景

  • jdk1.7中HashMap的数据结构基于数组+链表实现;
  • jdk1.8中使用的是数组+链表+红黑树。
  • jdk1.7中HashMap链表的插入方式头插法;
  • jdk1.8中HashMap的链表插入方式则使用的是尾插法。

二、出现问题的方法

首先我们需要明确的问题点出在哪个方法中,transfer() 正是它扩容的真正方法,而问题也出现此位于源码:

put() # addEntry() #resize()# transfer

在这里插入图片描述

举例

在线程1进行扩容时,由于使用了头插法,newTable[j]的链表中B节点指向了A节点

在线程2进行扩容时,由于使用了头插法,newTable[j]的链表中A节点又指向了B节点

在线程n进行扩容时,…

这就容易出现问题了。。在并发扩容结束后,可能导致A节点指向了B节点,B节点指向了A节点,链表中便有了环!!!

在这里插入图片描述

结果:

中…(img-4zJB6ksp-1662690082848)]

结果:

当我们取去遍历集合时,因为此时链表成环,所以遍历就会死循环,所以就出问题了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值