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

深度解析 ConcurrentHashMap 1.8:put 与 get 核心流程全解

在 Java 并发编程中ConcurrentHashMap是线程安全的高频使用集合相比线程不安全的HashMap、效率低下的HashTable全锁JDK 1.8 版本的ConcurrentHashMap做了底层结构重构和锁机制优化成为高并发场景下的首选 Map 实现。本文将逐行拆解核心原理深度解析 ConcurrentHashMap 1.8 的put存值、get取值完整流程帮你彻底吃透这个高频面试 工作必备的核心组件。一、前置知识ConcurrentHashMap 1.8 核心特性先明确 1.8 版本的关键改动这是理解流程的基础底层结构从 1.7 的分段锁 数组 链表→ 改为数组 链表 红黑树锁机制放弃分段锁使用CAS synchronized 锁头节点实现细粒度并发并发效率锁的粒度从「分段」缩小到「数组桶的头节点」不同桶的操作完全并行性能大幅提升树化阈值链表长度 ≥8 且数组长度 ≥64 时链表转为红黑树查询效率从 O (n) 升为 O (logn)。核心常量DEFAULT_INITIAL_CAPACITY默认容量 16DEFAULT_LOAD_FACTOR负载因子 0.75TREEIFY_THRESHOLD树化阈值 8UNTREEIFY_THRESHOLD退化阈值 6二、ConcurrentHashMap 1.8 put 流程深度解析put方法的核心目标线程安全地将 key-value 存入集合处理哈希冲突、扩容、树化。整体流程分为8 个核心步骤我们结合源码逻辑逐段解析put 方法完整流程参数校验key 和 value 都不允许为 nullHashMap 允许直接抛空指针异常计算哈希值通过spread(key.hashCode())计算哈希高位参与运算减少哈希冲突初始化数组如果底层数组table为 null 或长度为 0执行initTable()初始化CAS 控制单线程初始化定位数组桶通过(n - 1) hash计算数组下标定位目标桶桶为空CAS 直接插入如果目标桶没有元素无锁使用 CAS 尝试插入新节点成功则直接结束桶不为空加锁处理冲突对桶的头节点加synchronized锁细粒度锁不影响其他桶判断桶内是链表还是红黑树链表遍历链表找到相同 key 则覆盖 value无相同 key 则追加到链表尾部红黑树调用红黑树插入方法处理节点插入 / 覆盖树化判断插入后检查链表长度达到树化阈值 8则执行treeifyBin()转为红黑树扩容检查插入完成后检查元素数量是否达到扩容阈值容量 ×0.75达到则执行resize()扩容并发扩容多线程协助迁移数据。put 流程核心细节为什么 key/value 不能为 null并发场景下无法区分「未存入」和「存入 null」会导致并发判断歧义而 HashMap 是单线程集合无此问题。CAS 无锁插入桶为空时用 CAS 保证原子性插入避免加锁开销提升并发效率synchronized 锁的是头节点只锁当前桶不同桶的 put 操作可以并行执行这是 1.8 并发性能远超 1.7 的核心原因并发扩容扩容时会生成一个新数组多线程可以协助迁移数据避免单线程扩容的性能瓶颈。put 源码核心片段简化版final V putVal(K key, V value, boolean onlyIfAbsent) { // 1. key/value 非空校验 if (key null || value null) throw new NullPointerException(); // 2. 计算哈希值 int hash spread(key.hashCode()); int binCount 0; // 自旋保证操作成功 for (NodeK,V[] tab table;;) { NodeK,V f; int n, i, fh; // 3. 数组未初始化CAS 初始化 if (tab null || (n tab.length) 0) tab initTable(); // 4. 定位桶为空CAS 直接插入新节点 else if ((f tabAt(tab, i (n - 1) hash)) null) { if (casTabAt(tab, i, null, new NodeK,V(hash, key, value, null))) break; } // 5. 桶正在扩容协助扩容 else if ((fh f.hash) MOVED) tab helpTransfer(tab, f); // 6. 桶有元素加锁头节点处理链表/红黑树 else { V oldVal null; synchronized (f) { // 锁头节点 if (tabAt(tab, i) f) { if (fh 0) { // 链表节点 binCount 1; for (NodeK,V e f;; binCount) { K ek; // key 相同覆盖 value if (e.hash hash ((ek e.key) key || (key ! null key.equals(ek)))) { 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; } } } } // 7. 链表长度达标树化 if (binCount ! 0) { if (binCount TREEIFY_THRESHOLD) treeifyBin(tab, i); if (oldVal ! null) return oldVal; break; } } } // 8. 检查扩容 addCount(1L, binCount); return null; }三、ConcurrentHashMap 1.8 get 流程深度解析get方法全程无锁是 ConcurrentHashMap 高并发读取的核心优势流程极简且高效。get 方法完整流程参数校验key 为 null 直接抛异常计算哈希值和 put 流程一致通过spread()计算哈希定位数组桶通过(n - 1) hash找到目标数组下标查找目标节点桶头节点哈希、key 匹配直接返回 value链表遍历链表找到匹配 key 则返回 value红黑树调用红黑树查找方法返回匹配节点的 value未找到返回 null。get 流程核心细节全程无锁为什么不需要加锁还能线程安全底层数组table用volatile修饰保证可见性一个线程修改其他线程立即感知节点的val和next也用volatile修饰读取时能获取最新值读操作不会修改数据天然线程安全无需加锁。效率极高无锁设计让读取操作几乎无开销高并发下读取性能接近 HashMap。get 源码核心片段简化版public V get(Object key) { NodeK,V[] tab; NodeK,V e, p; int n, eh; K ek; // 计算哈希 int h spread(key.hashCode()); // 1. 数组不为空 目标桶存在元素 if ((tab table) ! null (n tab.length) 0 (e tabAt(tab, (n - 1) h)) ! null) { // 2. 头节点匹配直接返回 if ((eh e.hash) h) { if ((ek e.key) key || (key ! null key.equals(ek))) return e.val; } // 3. 红黑树节点查找 else if (eh 0) return (p e.find(h, key)) ! null ? p.val : null; // 4. 链表遍历查找 while ((e e.next) ! null) { if (e.hash h ((ek e.key) key || (key ! null key.equals(ek)))) return e.val; } } // 未找到返回 null return null; }四、put 与 get 流程核心对比特性put 流程get 流程线程安全方式CAS synchronized 锁头节点全程无锁volatile 保证可见性性能开销有锁开销细粒度并发度高无锁开销极低数据修改会修改集合插入 / 覆盖 / 扩容 / 树化只读不修改任何数据失败重试自旋保证插入成功无重试直接返回结果

相关文章:

深度解析 ConcurrentHashMap 1.8:put 与 get 核心流程全解

在 Java 并发编程中,ConcurrentHashMap 是线程安全的高频使用集合,相比线程不安全的 HashMap、效率低下的 HashTable(全锁),JDK 1.8 版本的 ConcurrentHashMap 做了底层结构重构和锁机制优化,成为高并发场景…...

时间切片:24小时

基于双层优化的电动汽车优化调度研究 代码主要做的是一个双层的电动汽车充放电行为优化问题,具体来讲,输电网上层优化将电动汽车与发电机、基本负荷协调,同时考虑风力发电,从而在时域内优化电动汽车的负荷周期。 然后,…...

嵌入式软件架构设计:硬件抽象层实践

嵌入式软件架构设计:建立硬件抽象层的工程实践 1. 嵌入式软件架构概述 1.1 架构设计的必要性 在嵌入式系统开发中,软件架构设计直接影响产品的可维护性、可扩展性和可移植性。良好的架构设计能够: 减少不必要的返工 建立宏观层面的开发规…...

FPGA调试避坑指南:Vivado ILA采样深度和探针位宽怎么设?资源占用与调试效果的平衡术

FPGA调试实战:ILA采样深度与探针位宽的黄金平衡法则 当你在Artix-7芯片上调试一个包含32位计数器和多状态机的设计时,突然发现ILA吃掉了一半的Block RAM资源,而采样深度却只够捕获5个时钟周期的数据——这种场景是否似曾相识?本文…...

轨迹规划实战:用多项式插值+粒子群玩转机械臂运动优化

轨迹规划 路径规划 matlab 353多项式插值 基于改进粒子群算法 时间最优 针对六自由度 四自由度都可以,轨迹规划,多项式插值,更改轨迹点位置就可以搞机器人轨迹规划最头疼的就是既要轨迹丝滑又要时间最短。今天咱们用Matlab整点狠活—…...

开源条码字体技术:如何通过字体文件彻底改变条码生成方式

开源条码字体技术:如何通过字体文件彻底改变条码生成方式 【免费下载链接】librebarcode Libre Barcode: barcode fonts for various barcode standards. 项目地址: https://gitcode.com/gh_mirrors/li/librebarcode 条码生成技术长期以来依赖专业软件和专用…...

气候降尺度全流程实战:从 CMIP6 数据到极端气候预估,科研人一站式通关

做水文气象、气候学、地理遥感、生态环境等领域的科研人&#xff0c;是不是都逃不过这些噩梦&#xff1a;尺度鸿沟难跨越&#xff1a;GCM 粗网格&#xff08;>100km&#xff09;和流域 / 城市精细尺度&#xff08;<10km&#xff09;不匹配&#xff0c;动力降尺度成本太高…...

STM32F103 LoRa物理层驱动库详解与工程实践

1. 项目概述LoRa_STM32 是一个面向 STM32F103CB 微控制器平台的 LoRa 通信库&#xff0c;本质是 sandeepmistry/arduino-LoRa 库在 STM32 平台上的适配分支。它并非独立开发的全新协议栈&#xff0c;而是通过 Arduino Core for STM32&#xff08;rogerclarkmelbourne/Arduino_S…...

3步搞定Google Drive受保护PDF:高效下载完整指南

3步搞定Google Drive受保护PDF&#xff1a;高效下载完整指南 【免费下载链接】Google-Drive-PDF-Downloader 项目地址: https://gitcode.com/gh_mirrors/go/Google-Drive-PDF-Downloader 你是否曾遇到过这样的情况&#xff1f;在Google Drive中找到一个急需的技术文档或…...

高效解决多设备滚动冲突难题的Scroll Reverser工具

高效解决多设备滚动冲突难题的Scroll Reverser工具 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser Scroll Reverser是一款专为macOS用户设计的开源效率工具&#xff0c;它能够为…...

告别杂乱农场:星露谷物语规划神器助你打造高效田园

告别杂乱农场&#xff1a;星露谷物语规划神器助你打造高效田园 【免费下载链接】stardewplanner Stardew Valley farm planner 项目地址: https://gitcode.com/gh_mirrors/st/stardewplanner 你是否曾在星露谷物语中面对一片荒地感到无从下手&#xff1f;种植区域混乱、…...

HunyuanVideo-Foley实战案例:为纪录片自动匹配环境音效的完整工作流

HunyuanVideo-Foley实战案例&#xff1a;为纪录片自动匹配环境音效的完整工作流 1. 项目背景与需求 在纪录片制作过程中&#xff0c;环境音效的采集和匹配往往需要耗费大量时间和人力成本。传统方式需要音效师实地录制或从音效库中手动挑选&#xff0c;整个过程耗时且难以保证…...

OpenClaw怎么集成?OpenClaw移动云小白6分钟搭建及使用指南【最新!】

OpenClaw怎么集成&#xff1f;OpenClaw移动云小白6分钟搭建及使用指南【最新&#xff01;】。OpenClaw怎么部署&#xff1f;本文面向零基础用户&#xff0c;完整说明在轻量服务器与本地Windows11、macOS、Linux系统中部署OpenClaw&#xff08;Clawdbot&#xff09;的流程&#…...

从人工到智能:SubtitleOCR如何实现硬字幕提取的效率革命

从人工到智能&#xff1a;SubtitleOCR如何实现硬字幕提取的效率革命 【免费下载链接】SubtitleOCR 快如闪电的硬字幕提取工具。仅需苹果M1芯片或英伟达3060显卡即可达到10倍速提取。A very fast tool for video hardcode subtitle extraction 项目地址: https://gitcode.com/…...

OpenClaw核心揭秘:Agentic Loop如何驱动AI持续思考与行动?

上一篇讲了 Gateway——它像餐厅前台&#xff0c;负责接收订单、分发任务。 但订单到了厨房&#xff0c;厨师是怎么做菜的&#xff1f; 这就是 Agentic Loop&#xff08;推理循环&#xff09;的事了。 它是 OpenClaw 的"大脑"&#xff0c;决定 Agent 如何思考、如何行…...

东佑达步进电缸控制器TC100的labview控制vi,可以通过RS485控制电缸运动

东佑达步进电缸控制器TC100的labview控制vi&#xff0c;可以通过RS485控制电缸运动搞TC100步进电缸纯粹是工位剩下一台&#xff0c;手边摸鱼攒的带隔离USB转485&#xff08;怕烧这玩意儿的输入输出&#xff0c;几十块钱的CP2102光耦隔离那种&#xff0c;学生党/小作坊首选&…...

Linux initramfs深度解析: 从内核启动到根文件系统的桥梁(3)

接前一篇文章&#xff1a;Linux initramfs深度解析: 从内核启动到根文件系统的桥梁&#xff08;2&#xff09; 设计思想与架构 1. 为什么需要initramfs 在initramfs出现之前&#xff0c;系统启动有一个根本性的问题&#xff1a;内核需要访问根文件系统来加载驱动程序&#xf…...

深入解析NAND Flash基础操作与系统集成——从阵列结构到多Die协同

1. NAND Flash基础结构与工作原理 NAND Flash存储器是现代存储系统的核心组件&#xff0c;从U盘到企业级SSD都依赖这项技术。要理解它的强大之处&#xff0c;得先从它的物理结构说起——想象一个巨大的立体停车场&#xff0c;每个停车位就是一个存储单元&#xff0c;而控制电路…...

颠覆PDF转换体验:Marker无缝实现25页/秒全场景文档格式精准迁移

颠覆PDF转换体验&#xff1a;Marker无缝实现25页/秒全场景文档格式精准迁移 【免费下载链接】marker 一个高效、准确的工具&#xff0c;能够将 PDF 和图像快速转换为 Markdown、JSON 和 HTML 格式&#xff0c;支持多语言和复杂布局处理&#xff0c;可选集成 LLM 提升精度&#…...

GitHub Desktop中文汉化终极指南:三分钟解锁全中文Git操作体验

GitHub Desktop中文汉化终极指南&#xff1a;三分钟解锁全中文Git操作体验 【免费下载链接】GitHubDesktop2Chinese GithubDesktop语言本地化(汉化)工具 项目地址: https://gitcode.com/gh_mirrors/gi/GitHubDesktop2Chinese 还在为GitHub Desktop的英文界面而烦恼吗&am…...

宁波小程序公司提供专业的小程序开发服务

在宁波小程序公司的服务中&#xff0c;我们致力于为客户提供清晰的内容结构和流畅的表达。我们通过深入的需求分析&#xff0c;确保每个项目都能符合客户特定的期望和市场需求。设计阶段注重市场调研&#xff0c;力求在视觉和功能上都能满足用户的使用习惯和偏好。开发过程中&a…...

Play Integrity Fix:高效解决Android设备认证问题的实战指南

Play Integrity Fix&#xff1a;高效解决Android设备认证问题的实战指南 【免费下载链接】PlayIntegrityFix Fix Play Integrity (and SafetyNet) verdicts. 项目地址: https://gitcode.com/GitHub_Trending/pl/PlayIntegrityFix 问题引入&#xff1a;Android设备认证的…...

突破VMware限制:在非苹果硬件上构建macOS开发环境完全指南

突破VMware限制&#xff1a;在非苹果硬件上构建macOS开发环境完全指南 【免费下载链接】unlocker 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker 实现跨平台macOS体验&#xff1a;VMware Unlocker核心价值解析 当开发者需要在Windows或Linux工作站上构建m…...

微信无法登录时的恢复操作

本文记录 OpenClaw 中 openclaw-weixin 插件在登录态丢失、微信链接不可用、扫码登录失败时的恢复流程。2026-03-23 版本 OpenClaw 更新后曾出现微信插件失效,但在 2026-03-24 版本中已恢复。本文目标是先判断问题类型,再选择最小影响的修复方式,避免不必要的全量重装。 一、…...

老牌CMS的隐痛:从DedeCMS漏洞看开源系统会员模块的安全设计误区

DedeCMS会员模块漏洞剖析&#xff1a;开源系统安全设计的深层反思 当一款拥有百万级安装量的老牌CMS系统曝出前台任意密码修改漏洞时&#xff0c;我们看到的不仅是一个具体的技术缺陷&#xff0c;更是开源项目在安全架构设计上的系统性隐忧。2018年那场影响广泛的DedeCMS漏洞事…...

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(五)- 动态配置与性能优化实战(vsetvli/vsetivli/vsetvl)

1. 动态向量配置指令的核心作用 RISC-V向量扩展指令集中最精妙的设计之一&#xff0c;就是允许程序运行时动态调整向量处理参数的机制。想象你正在用不同尺寸的螺丝刀组装家具——当遇到大螺丝就换大号刀头&#xff0c;碰到小螺丝立即切换精密刀头&#xff0c;这就是vsetvli/vs…...

MicroOS:Arduino轻量级任务调度内核详解

1. MicroOS&#xff1a;面向Arduino的轻量级任务管理内核概述MicroOS是一个专为Arduino平台设计的极简型实时任务管理器&#xff0c;其核心定位并非替代FreeRTOS或Zephyr等完整RTOS&#xff0c;而是填补Arduino原生loop()单线程模型在多任务调度、精确定时与事件解耦方面的空白…...

利用快马平台十分钟搭建树莓派环境监测系统原型

今天想和大家分享一个快速搭建树莓派环境监测系统的小实验。作为一个硬件爱好者&#xff0c;我经常用树莓派做各种物联网原型开发&#xff0c;但每次从零开始配置环境、写基础代码都很耗时。最近发现InsCode(快马)平台能帮我省去很多重复工作&#xff0c;特别适合快速验证想法。…...

用MediaPipe和Python做个隔空切水果游戏:从手势骨架提取到简单游戏逻辑实现

用MediaPipe和Python打造体感切水果游戏&#xff1a;从手势识别到游戏逻辑全解析 还记得小时候在街机厅玩《水果忍者》的畅快感吗&#xff1f;现在&#xff0c;我们完全可以用Python和MediaPipe技术&#xff0c;在电脑前通过手势隔空切水果&#xff01;本文将带你从零开始&…...

STM32串口通信原理与实现详解

串口通信技术深度解析&#xff1a;从原理到STM32实现1. 串口通信基础概念1.1 数据传送方向分类串行通信根据数据传输方向可分为三种基本模式&#xff1a;单工模式&#xff1a;数据仅支持单向传输&#xff0c;如传统的广播系统。发送端和接收端角色固定&#xff0c;硬件上只需单…...