多线程下jdk1.7的头插法导致的死循环问题

多线程下jdk1.7的头插法导致的死循环问题

【新版Java面试专题视频教程,java八股文面试全套真题+深度详解(含大厂高频面试真题)】
在这里插入图片描述
jdk1.7在hashmap扩容时使用的是头插法,所以扩容后元素的顺序是相反的

在多线程情况下:
在这里插入图片描述
现在开始扩容,在扩容初始状态时,2个线程的e都指向了A,next都指向了B

之后线程2抢到了时间片,线程2开始对hashmap进行扩容:
在这里插入图片描述
线程2扩容完之后,因为数据迁移过程中只是改变了对象的引用,所以线程1的e依旧指向A,next依旧指向B
现在线程1开始扩容工作:

  • 在第1次循环时,线程1会把e指向的A插入到线程1扩容后的数组上,之后因为要执行e=next,此时的next=B,所以第一次循环后e指向了B,next指向了A
    在这里插入图片描述

  • 在第2次循环时,线程1会把e指向的B插入到扩容后的数组上,之后继续执行e=next,此时的next=A,所以第二次循环后e指向了A,next指向了null

  • 第3次循环时,线程1会把e指向的A再次插入到扩容后的数组上,之后继续执行e=next,此时的next=null,所以第二次循环后e指向了null
    在这里插入图片描述

  • 扩容结束,出现了多线程死循环
    在这里插入图片描述

总结:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值