ConcurrentHashMap 线程安全实现

发布时间:2026/8/19 12:28:02

ConcurrentHashMap 线程安全实现
1. JDK 1.7 vs 1.8 的演进首先咱们吃水不忘打井人来看一下历程维度JDK 1.7JDK 1.8数据结构Segment 数组 HashEntry 数组 链表Node 数组 链表 红黑树锁机制分段锁ReentrantLockCAS synchronized锁桶头节点锁粒度锁一段默认 16 段锁单个桶粒度更细并发度最多 16 个线程同时写理论上限 数组长度这信息量还是很大的之前也写过2. JDK 1.8 线程安全的四大支柱支柱一volatile 保证可见性Node 节点的val和next也是 volatile 的。这意味着一个线程写入后其他线程立刻能看到最新值读操作完全无锁。transient volatile NodeK,V[] table; // 哈希桶数组volatile 保证扩容后对所有线程可见 transient volatile NodeK,V[] nextTable; // 扩容期间的新数组非扩容时为 null transient volatile int sizeCtl; // 核心控制字段下面详解 transient volatile int transferIndex; // 扩容时记录迁移进度 transient volatile long baseCount; // 基础计数值sizeCtl是一个多态字段不同值代表不同含义sizeCtl 的值含义-1正在初始化其他线程自旋等待-(1N)有 N 个线程正在扩容正数下次扩容的阈值容量 × 0.750未初始化使用默认容量这个字段用一个 int 同时表达了初始化状态 扩容线程数 扩容阈值三重语义是 Doug Lea 的经典设计。支柱二CAS 实现无锁插入当目标桶是空的不需要加锁直接用 CAS 原子操作插入final V putVal(K key, V value, boolean onlyIfAbsent) { // ① 禁止 null key 和 null value if (key null || value null) throw new NullPointerException(); // ② 二次哈希扰动函数和 HashMap 一样 int hash spread(key.hashCode()); int binCount 0; // ③ 外层无限循环CAS 自旋 for (NodeK,V[] tab table;;) { NodeK,V f; int n, i, fh; // 情况1数组还没初始化CAS 初始化 if (tab null || (n tab.length) 0) tab initTable(); // 内部用 CAS 保证只有一个线程能初始化 // 情况2目标桶是空的CAS 直接插入无锁 else if ((f tabAt(tab, i (n - 1) hash)) null) { if (casTabAt(tab, i, null, new NodeK,V(hash, key, value, null))) break; // CAS 成功跳出循环 // CAS 失败说明有别的线程抢先了继续循环重试 } // 情况3桶头节点是 ForwardingNodehash MOVED -1 // 说明正在扩容当前线程加入扩容大军 else if ((fh f.hash) MOVED) tab helpTransfer(tab, f); // 情况4桶不为空发生冲突 → 加锁 else { V oldVal null; synchronized (f) { // 锁住桶的头节点 if (tabAt(tab, i) f) { // 双重检查确保桶没被换过 if (fh 0) { // 普通链表 binCount 1; for (NodeK,V e f;; binCount) { if (e.hash hash (e.key key || key.equals(e.key))) { oldVal e.val; if (!onlyIfAbsent) e.val value; // 覆盖旧值 break; } NodeK,V pred e; if ((e e.next) null) { pred.next new NodeK,V(hash, key, value, null); break; } } } else if (f instanceof TreeBin) { // 红黑树 NodeK,V p; binCount 2; if ((p ((TreeBinK,V)f).putTreeVal(hash, key, value)) ! null) { oldVal p.val; if (!onlyIfAbsent) p.val value; } } } } // 链表长度 8尝试树化 if (binCount ! 0) { if (binCount TREEIFY_THRESHOLD) treeifyBin(tab, i); if (oldVal ! null) return oldVal; break; } } } // ⑤ 更新计数可能触发扩容 addCount(1L, binCount); return null; }支柱三synchronized 锁桶头节点当桶不为空发生冲突只锁住这个桶的头节点else { synchronized (f) { // f 是桶的头节点 if (tabAt(tab, i) f) { // 双重检查 if (fh 0) { // 链表操作遍历、插入 } else if (f instanceof TreeBin) { // 红黑树操作 } } } }这意味着不同桶的写操作互不阻塞只有操作同一个桶的线程才会竞争同一把锁。支柱四多线程协同扩容ConcurrentHashMap扩容不是单线程搬数据而是所有正在操作的线程一起帮忙搬else if ((fh f.hash) MOVED) // 发现桶里放的是 ForwardingNode迁移标记说明正在扩容 tab helpTransfer(tab, f); // 当前线程加入扩容大军当某个线程触发扩容时会在每个桶的头节点放一个ForwardingNodehash 值为 MOVED。其他线程插入时发现这个标记就知道“正在搬家”于是放下手中的活协助搬运数据。搬完后再回来继续插入。3. 为什么 key 和 value 不能为 null在单线程的 HashMap 中get(key)返回 null 可以区分“值为 null”和“key 不存在”用containsKey验证。但在并发环境下containsKey和get之间可能被其他线程插入或删除导致判断失效。为了消除二义性ConcurrentHashMap 直接禁止 null。4. size() 为什么是“估算值”JDK 1.8 用baseCount CounterCell[]分散计数类似 LongAdder 的思想。高并发下多个线程同时 CAS 更新 baseCount失败的就更新 CounterCell 数组中的某个槽位减少竞争。所以size()返回的是一个弱一致性的近似值在并发场景下足够用。核心总结知识点关键结论HashMap 定位(n-1) hash数组长度必须是 2 的幂扩容触发元素数 容量 × 0.75扩容迁移(hash oldCap) 0留原位否则移到原位 oldCap树化条件链表 ≥ 8且数组 ≥ 64退化条件红黑树节点 ≤ 6CHM 读操作完全无锁volatile 保证可见性CHM 写操作空桶 CAS冲突桶 synchronized 锁头节点CHM 扩容多线程协同ForwardingNode 标记迁移状态

相关新闻

基于ARM Cortex-M3的GPS定位器DIY:从硬件选型到地图显示全流程

基于ARM Cortex-M3的GPS定位器DIY:从硬件选型到地图显示全流程

2026/8/19 12:28:02

1. 项目概述:从零打造一台“复古智能”GPS定位器 几年前,我在一个电子爱好者论坛上看到一个老外玩家用一块LPC1768开发板,结合一个GPS模块和一块小屏幕,做了一个能显示地图和轨迹的“智能设备”。当时就觉得这个想法特别酷——它不…

iOS激活锁绕过工具applera1n使用教程:从检查设备到免费解锁的完整路线图

iOS激活锁绕过工具applera1n使用教程:从检查设备到免费解锁的完整路线图

2026/8/19 12:28:02

iOS激活锁绕过工具applera1n使用教程:从检查设备到免费解锁的完整路线图 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 一台被你遗忘密码的旧 iPhone,卡在"欢迎使用"…

碳离子电池技术解析:从超级电容原理到5分钟快充的工程挑战

碳离子电池技术解析:从超级电容原理到5分钟快充的工程挑战

2026/8/19 12:28:02

1. 从“充电焦虑”到“五分钟革命”:碳离子电池的颠覆性潜力 如果你和我一样,是个对技术趋势保持敏感的人,那么最近几年关于电池的新闻,多半会让你在兴奋与麻木之间反复横跳。今天这家宣布能量密度提升10%,明天那家说循…

锤子助手第121个开关:启用自动下载视频的位置、安全验证与存储流量边界

锤子助手第121个开关:启用自动下载视频的位置、安全验证与存储流量边界

2026/8/19 13:28:05

🔥 个人主页: 杨利杰YJlio ❄️ 个人专栏: 《Windows 疑难杂症与工单复盘案例库》 《Sysinternals实战教程》 《WINDOWS教程》 《Windows PowerShell 实战》 《IOS插件分析测试》 《超简单:用Python让Excel飞起来》…

锤子助手第120个开关:显示跳转小程序的位置、配置方法与路径授权边界

锤子助手第120个开关:显示跳转小程序的位置、配置方法与路径授权边界

2026/8/19 13:28:05

🔥 个人主页: 杨利杰YJlio ❄️ 个人专栏: 《Windows 疑难杂症与工单复盘案例库》 《Sysinternals实战教程》 《WINDOWS教程》 《Windows PowerShell 实战》 《IOS插件分析测试》 《超简单:用Python让Excel飞起来》…

锤子助手第113个开关:启用分享复读的位置、安全验证与外部来源边界

锤子助手第113个开关:启用分享复读的位置、安全验证与外部来源边界

2026/8/19 13:28:05

🔥 个人主页: 杨利杰YJlio ❄️ 个人专栏: 《Windows 疑难杂症与工单复盘案例库》 《Sysinternals实战教程》 《WINDOWS教程》 《Windows PowerShell 实战》 《IOS插件分析测试》 《超简单:用Python让Excel飞起来》…

锤子助手第112个开关:启用笔记复读的位置、验证方法与混合内容隐私边界

锤子助手第112个开关:启用笔记复读的位置、验证方法与混合内容隐私边界

2026/8/19 13:28:05

🔥 个人主页: 杨利杰YJlio ❄️ 个人专栏: 《Windows 疑难杂症与工单复盘案例库》 《Sysinternals实战教程》 《WINDOWS教程》 《Windows PowerShell 实战》 《IOS插件分析测试》 《超简单:用Python让Excel飞起来》…

如何彻底掌控惠普OMEN游戏本性能?开源工具OmenSuperHub风扇功耗控制完整指南

如何彻底掌控惠普OMEN游戏本性能?开源工具OmenSuperHub风扇功耗控制完整指南

2026/8/19 13:28:05

如何彻底掌控惠普OMEN游戏本性能?开源工具OmenSuperHub风扇功耗控制完整指南 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenS…

Linux 终端命令速查表 -- 20 渗透测试工具速查表

Linux 终端命令速查表 -- 20 渗透测试工具速查表

2026/8/19 13:18:05

信息收集 绘制目标地图:发现主机、开放端口、子域名和服务。 命令 说明 nmap 网络扫描与端口探测 zenmap Nmap 的图形界面 masscan 高速互联网端口扫描器 netdiscover 被动/主动 ARP 侦察工具 amass 深度子域名枚举 subfinder 子域名发现工具 dmitry 深度信息收集工具 ike-sc…

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

2026/8/19 3:36:59

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

2026/8/19 9:17:18

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

2026/8/19 8:02:16

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

SQL 调优 [ 2 ]

SQL 调优 [ 2 ]

2026/8/19 0:07:32

type列详解EXPLAIN输出的type列描述了表是如何连接的,性能从最好到最差的排序如下:systemconsteq_refreffulltextref_or_nullindex_mergeunique_subqueryindex_subqueryrangeindexALL接下来我们对 type列 做详细讲解。我们都知道,想要评估一条…

正式评优怎么选投票工具?人人微投票审计级防刷能力实测

正式评优怎么选投票工具?人人微投票审计级防刷能力实测

2026/8/19 0:07:32

在线上投票工具遍地开花的今天,选择一个合适的平台,本质上是在做一道关于场景与需求的匹配题。人人微投票是一个很典型的案例——它的产品逻辑、技术架构和商业模式,都围绕着“正式评选”这个细分场景深度扎根,也因此形成了自己鲜…

15 天 3 连发:DeepSeek 的「机枪」节奏,到底在下什么棋?

15 天 3 连发:DeepSeek 的「机枪」节奏,到底在下什么棋?

2026/8/19 0:07:32

15 天 3 连发:DeepSeek 的「机枪」节奏,到底在下什么棋?回看 2026 年 8 月这半个月,DeepSeek 的动作密度堪称疯狂:月初端出便宜快速的 V4-Flash,8 月 13 日同一天甩出 V4-Pro 正式版 开源 Harness 框架&am…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/17 12:00:53

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/15 10:10:27

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/18 12:20:24

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…