当前位置: 首页 > article >正文

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

20250208

  • 多线程下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
    在这里插入图片描述

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

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


http://www.kler.cn/a/538177.html

相关文章:

  • 物品匹配问题-25寒假牛客C
  • Nginx部署Umi React前端项目标准配置
  • 【Pandas】pandas Series sum
  • 鸿蒙 router.back()返回不到上个页面
  • 人工智能A*算法与CNN结合- CNN 增加卷积层的数量,并对卷积核大小进行调整
  • c++ 面试题
  • 学JDBC 第二日
  • OSwatch性能分析工具部署
  • 为什么要学习AI/机器学习
  • 2025年02月07日Github流行趋势
  • vnev/Scripts/activate : 无法加载文件
  • 深度学习之DCGAN算法深度解析
  • 微服务组件LoadBalancer负载均衡
  • GnuTLS: 在 pull 函数中出错。 无法建立 SSL 连接。
  • 求组合数,
  • ubuntu18.04 编译安装opencv3.4.8
  • 云计算真的可以提高企业的IT敏捷性吗?
  • 【简单】27.移除元素
  • 《Java核心技术 卷II》本地化的数字格式
  • 3.攻防世界 Confusion1(服务器模板注入SSTI)
  • 直接抓取网页的爬虫技术:限制与合规挑战
  • 订单超时设计(1)--- 如何使用redis实现订单超时实时关闭功能
  • 软件测试就业
  • 前端学习-页面加载事件和页面滚动事件(三十二)
  • vue3:点击子组件进行父子通信
  • spring cloud和spring boot的区别