news 2026/10/27 23:23:27

jdk1.7 在多线程下扩容可能导致的死循环问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
jdk1.7 在多线程下扩容可能导致的死循环问题

首先先看看 hashmap 在jdk1.7 下扩容的核心方法

void transfer(Entry[] newTable) { Entry[] src = table; int newCapacity = newTable.length; // 遍历旧数组的每一个格子(桶) for (int j = 0; j < src.length; j++) { Entry<K,V> e = src[j]; if (e != null) { src[j] = null; // 断开旧数组的引用,虽然不是必须的,但有助于GC // 遍历链表,把链表上的节点一个一个摘下来,重新放到新数组里 do { // 【关键点1】先保存下一个节点,防止待会链表断了找不到后面的人 Entry<K,V> next = e.next; // 计算这个节点在新数组中的下标 int i = indexFor(e.hash, newCapacity); // 【关键点2】头插法核心:将当前节点 e 的 next 指向新数组位置原本的头节点 e.next = newTable[i]; // 【关键点3】将新数组该位置的头指针指向 e(e 变成了新的头节点) newTable[i] = e; // 【关键点4】继续处理旧链表的下一个节点 e = next; } while (e != null); } } }

可以看到,jdk1.7 版本下的扩容依靠的是头插法实现元素搬移的

头插法 的特点:假设旧数组某个位置的链表是A -> B -> C。 因为代码逻辑是:每次把新来的元素插到最前面(e.next = newTable[i]然后newTable[i] = e)。 所以搬运到新数组后,顺序会倒置,变成C -> B -> A。

为什么JDK 1.7用头插法? 设计者当时认为,后插入的数据被访问的概率更高(热点数据),放在头部查得快。但这在多线程下埋下了祸根。

那其实在多线程的情况下就会有问题了,举个例子:

假设有两个线程Thread 1和Thread 2同时在扩容。 旧链表结构:A -> B。 线程 1 执行到你注释的那一行挂起了(Paused):

Entry<K,V> next = e.next; // 线程1在这里卡住了! // 此时对于线程1来说: e = A, next = B
接下来可能发生的事情:
  1. 线程 2 抢占 CPU 完成了扩容:
    • Thread 2 把A和B都搬到了新数组。
    • 注意:因为是头插法,顺序反了
    • 在新内存里,现在的链表结构是:B -> A(B 指向 A,A 指向 null)。
  1. 线程 1 醒来继续执行:
    • Thread 1 里的变量还停留在挂起前的状态:e = A,next = B。
    • Thread 1 开始干活:
      • 将 A 指向 B
      • 头节点变成 A
      • 此时 A 指向 B,B 指向 A(死循环开始)
  1. 线程 1 接着处理 B,B 头插当头节点,此时 B 指向 A,A 指向 B
  2. 然后接着处理 A,A 头插当头节点,此时 A 指向 B,B 指向 A
  3. 然后循环往复 A,B 轮流当头节点,死循环

如图:


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/27 17:00:45

零基础掌握X-AnyLabeling:GeCO模型目标计数实战全解析

想要快速上手AI辅助的目标计数任务吗&#xff1f;X-AnyLabeling结合GeCO模型为您提供了一站式解决方案&#xff0c;让复杂的人群密度分析和目标统计变得简单直观。 【免费下载链接】X-AnyLabeling Effortless data labeling with AI support from Segment Anything and other a…

作者头像 李华
网站建设 2026/10/27 3:10:30

Windows界面美化终极指南:DWMBlurGlass实现透明效果全解析

Windows界面美化终极指南&#xff1a;DWMBlurGlass实现透明效果全解析 【免费下载链接】DWMBlurGlass Add custom effect to global system title bar, support win10 and win11. 项目地址: https://gitcode.com/gh_mirrors/dw/DWMBlurGlass 还在为Windows系统单调的界面…

作者头像 李华
网站建设 2026/10/27 6:59:49

掌握Tianshou:PyTorch强化学习框架从入门到实战

Tianshou强化学习框架作为基于PyTorch的专业级工具&#xff0c;为开发者和研究人员提供了构建智能决策系统的完整解决方案。这个名为"天授"的框架真正体现了其名字的含义&#xff0c;让机器智能在与环境的交互中自主学习成长。✨ 【免费下载链接】tianshou An elegan…

作者头像 李华
网站建设 2026/10/27 22:18:45

百度网盘秒传链接高效使用指南:从零基础到精通

百度网盘秒传链接高效使用指南&#xff1a;从零基础到精通 【免费下载链接】baidupan-rapidupload 百度网盘秒传链接转存/生成/转换 网页工具 (全平台可用) 项目地址: https://gitcode.com/gh_mirrors/bai/baidupan-rapidupload 在文件分享与管理的日常工作中&#xff0…

作者头像 李华
网站建设 2026/10/27 3:47:35

QQ截图独立版:解锁Windows屏幕捕捉新体验的完整手册

QQ截图独立版&#xff1a;解锁Windows屏幕捕捉新体验的完整手册 【免费下载链接】QQScreenShot 电脑QQ截图工具提取版,支持文字提取、图片识别、截长图、qq录屏。默认截图文件名为ScreenShot日期 项目地址: https://gitcode.com/gh_mirrors/qq/QQScreenShot 还在为复杂的…

作者头像 李华
网站建设 2026/10/27 0:18:10

Emby界面美化完全手册:3种方法打造专属影音中心

还在为Emby单调的界面而烦恼吗&#xff1f;想要打造一个既美观又实用的个人影音中心&#xff0c;却不知从何入手&#xff1f;这份完全手册将为你揭秘三种简单易行的Emby界面美化方案&#xff0c;让新手也能轻松上手&#xff0c;快速实现界面升级。 【免费下载链接】emby-crx Em…

作者头像 李华