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

jdk1.8的hashmap扩容时会发生数据丢失吗,大家来看看我的说法对不对

JDK1.8 HashMap 并发扩容数据丢失问题分析

一、核心结论

JDK 1.8 的 HashMap 仅通过尾插法解决了 JDK1.7 并发扩容时环形链表死循环问题,但没有解决并发扩容导致的数据丢失问题,HashMap 依旧线程不安全,多线程同时触发扩容依然会出现元素丢失、数据覆盖现象。

二、场景前置条件

  1. HashMap 原始数组 table 容量 = 2

  2. 数组下标 1 位置链表:3 -> 7 -> 5

  3. 存在两个并发线程:线程 A、线程 B,同时执行扩容resize()方法

  4. JDK1.8 扩容逻辑:按节点 hash 高位区分,原链表拆分为两条子链表,低位链表留在原下标,高位链表迁移至原下标 + 原容量位置,采用尾插法迁移节点

三、线程调度时序复现数据丢失过程

步骤 1:两线程同时进入扩容逻辑,线程 A 中途阻塞

线程 A、B 同步读取旧数组,开始遍历下标 1 的链表迁移节点;

线程 A 遍历到节点e=3,预存下一个节点引用next=7,此时 CPU 切换,线程 A 被阻塞挂起。

步骤 2:线程 B 完整执行扩容,完成数组替换

线程 B 不受阻塞,完整遍历整条链表3->7->5,按 hash 拆分迁移:

  • 元素 5:hash 高位为 0,留在新数组下标 1;

  • 元素 3、7:hash 高位为 1,迁移至新数组下标 3,形成链表3->7->null

    线程 B 完成全部节点迁移,将扩容后的新数组赋值给 HashMap 全局变量

    table

    ,旧数组引用失效。

此时内存中最新 table 状态:

  • table[1] = 5

  • table[3] = 3 -> 7 -> null

步骤 3:线程 A 恢复时间片,基于旧引用继续遍历丢数据

线程 A 被唤醒后,持有的仍是扩容前旧链表的引用,继续执行循环:

  1. 先处理节点e=3,完成迁移;

  2. 读取预存的next=7,赋值给e,继续处理节点 7;

  3. 读取节点 7 的后继指针7.next = nullnext赋值为 null;

  4. 循环判定next == null,直接终止链表遍历。

步骤 4:最终结果 —— 元素 5 永久丢失

线程 A 只遍历了3、7两个节点,完全没有读取到节点 5,不会对 5 做任何迁移操作;

线程 A 迁移完成后覆盖数组,最终新数组中不存在元素 5,数据丢失

http://www.jsqmd.com/news/1158112/

相关文章:

  • x265 MotionEstimate::motionEstimate 深度源码拆解
  • 2026五大AI编程助手实战选型指南:Cursor/Copilot/Windsurf/Amazon Q/Claude Code深度对比
  • AI大模型应用开发实战:从架构设计到工程落地的完整指南
  • MTK Audio HAL 录音流程深度解析:从 AudioRecord.read() 到 ALSA pcm_read() 的 12 个关键步骤
  • 2026年7月最新天梭成都武侯吾悦广场维修保养服务电话 - 天梭服务中心
  • 文化信息差变现:从麻将教程站看垂直领域SEO与流量转化策略
  • HBM 3D堆叠制造:从TSV硅通孔到中介层封装的5大核心工艺解析
  • 【VMware Workstation NAT 网络配置指南】
  • Godot游戏导出全攻略:从预设配置到多平台发布实战
  • web课程设计
  • 10_Openclaw安全合规工具域详解
  • 2026年中山东地区专业中空板周转箱销售厂家综合解析 - 品牌鉴赏官2026
  • CTF 编码入门|Base64 进制转换
  • 受欢迎的西宁茂枫商混站
  • Agent时代:企业AI接入内部系统,安全可控才是王道!
  • 南京爱彼回收价格查询及靠谱平台实测排行(2026年7月最新数据) - 爱彼中国官方服务中心
  • Muse智能体化图像生成:工具调用与自我优化技术解析
  • LabelImg 1.8.6 迁移至 Label Studio:3步完成项目升级与数据格式转换
  • STM32F103 矩阵键盘驱动优化:4x4扫描代码从5ms延时降到1ms响应
  • AI 辅助 API 文档生成与维护:从代码注释到交互式文档的完整链路
  • 小米账号解锁限制解析:每月1台与每年4台的策略与应对方案
  • 朗姆酒:从甘蔗到酒杯,一种充满加勒比阳光的烈酒
  • 2026年7月最新温州万国官方售后维修服务网点地址与客服电话 - 万国中国官方服务中心
  • 终极指南:3步免费下载百度文库任何文档(开源脚本完整教程)
  • 在 Visual Studio 中像 VS Code 一样查看每行代码的修改者
  • C# Environment.GetEnvironmentVariable 实战:3种作用域(Process/User/Machine)读取差异与场景
  • OpenClaw:轻量级本地智能体框架,支持跨平台AI工具编排
  • Apache HttpClient与OkHttpClient深度对比:性能、实战与选型指南
  • 2026湘潭正规漏水检测维修权威推荐-卫生间漏水免砸砖维修/厨房阳台墙面暗管漏水检测/屋顶外墙堵漏维修-防水补漏公司实测口碑榜推荐 - 即刻修防水
  • 七七独立站搭建工具:模块化电商开发实战指南