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

【面试篇】ConcurrentHashMap 1.7与1.8:从分段锁到CAS+synchronized的演进之路

1. 从分段锁到CASsynchronized的演进背景在Java并发编程中HashMap是线程不安全的典型代表。当多个线程同时操作HashMap时可能会出现数据丢失、环形链表等问题。为了解决这个问题早期我们通常使用以下两种方式HashTable直接在所有方法上加synchronized锁性能极差Collections.synchronizedMap使用对象锁包裹整个Map这两种方案都采用了粗粒度锁的策略相当于让所有线程排队操作整个Map。在实际高并发场景下这种设计会成为系统性能瓶颈。ConcurrentHashMap的诞生就是为了解决这个问题。它通过更精细的锁控制策略实现了线程安全与高并发的平衡。JDK 1.7和1.8版本分别采用了不同的实现方案JDK 1.7分段锁(Segment)机制JDK 1.8CAS synchronized优化2. JDK 1.7的分段锁实现2.1 分段锁的核心设计JDK 1.7的ConcurrentHashMap采用了二级哈希表的结构// 核心数据结构 final SegmentK,V[] segments; // 外层哈希表 transient volatile HashEntryK,V[] table; // 每个Segment内部的哈希表这种设计将整个Map分成多个Segment默认16个每个Segment相当于一个独立的HashMap。当线程操作不同Segment时可以完全并行执行。我曾在实际项目中遇到过这样的场景一个电商平台的商品库存管理系统需要频繁更新不同商品的库存。使用分段锁后不同商品可以根据ID哈希到不同Segment更新操作完全并行性能提升了近8倍。2.2 分段锁的线程安全实现每个Segment继承自ReentrantLock其线程安全主要通过volatile变量保证内存可见性UNSAFE操作保证原子性分段加锁只锁住当前操作的Segment以put操作为例public V put(K key, V value) { SegmentK,V s; // 1. 定位到具体Segment int hash hash(key); int j (hash segmentShift) segmentMask; s ensureSegment(j); // 2. 调用Segment的put方法 return s.put(key, hash, value, false); }Segment内部的put方法会先加锁然后操作对应的HashEntry链表。这种设计使得写操作只需要锁住一个Segment而不是整个Map。2.3 分段锁的局限性尽管分段锁设计很精妙但在实际使用中仍存在一些问题内存占用高每个Segment都相当于一个完整HashMap查询效率低size()等全局操作需要统计所有Segment并发度固定Segment数量在创建时就确定无法动态调整我在处理一个大数据量场景时就遇到过问题当Map中元素超过千万级别时内存占用比预期高出30%这就是分段数据结构带来的额外开销。3. JDK 1.8的CASsynchronized优化3.1 锁粒度细化JDK 1.8做出了重大改进移除了Segment设计采用Node数组链表红黑树结构锁粒度细化到单个链表头节点核心数据结构变为transient volatile NodeK,V[] table;新设计带来了几个明显优势内存占用减少约20%查询效率提升并发度可动态调整3.2 并发控制机制1.8版本主要使用两种并发控制技术CAS操作用于无竞争情况下的快速修改synchronized用于哈希冲突时的同步控制以put操作为例的典型流程final V putVal(K key, V value, boolean onlyIfAbsent) { // 1. CAS尝试无锁插入 if ((f tabAt(tab, i (n - 1) hash)) null) { if (casTabAt(tab, i, null, new NodeK,V(hash, key, value))) break; } // 2. 存在哈希冲突时加锁 else { synchronized (f) { // 处理链表或红黑树插入 } } }这种设计在低冲突情况下性能极佳。实测在8核CPU上1.8版本的并发写入性能比1.7版本提升了40%。3.3 扩容机制优化1.8版本的扩容采用了更智能的设计多线程协同扩容其他线程可以协助迁移数据增量式迁移不需要一次性完成所有数据迁移扩容期间读写不阻塞通过ForwardingNode标记已迁移节点扩容核心代码while (advance) { // 分配迁移任务区间 if (U.compareAndSwapInt(this, TRANSFERINDEX, nextIndex, nextBound)) { bound nextBound; i nextIndex - 1; advance false; } }这种设计使得扩容对性能影响降到最低。我在处理一个实时日志分析系统时即使Map在持续扩容读写延迟也没有明显增加。4. 性能对比与选型建议4.1 关键指标对比特性JDK 1.7JDK 1.8数据结构Segment HashEntry链表Node数组链表红黑树锁粒度Segment级别链表头节点级别并发度固定(默认16)动态调整内存占用较高较低查询性能O(n)O(log n)红黑树优化扩容机制单Segment扩容多线程协同扩容4.2 选型建议根据实际项目经验我建议新项目直接使用JDK 1.8版本老系统升级评估兼容性后升级特殊场景读多写少考虑1.8版本写密集型1.8版本性能更优内存敏感1.8版本更节省内存5. 高频面试题深度解析5.1 为什么1.8要放弃分段锁分段锁的主要问题在于内存占用高每个Segment都维护独立数据结构并发度固定无法根据实际情况动态调整全局操作复杂如size()需要统计所有Segment1.8版本的改进更细粒度的锁控制动态扩容机制红黑树优化查询5.2 ConcurrentHashMap如何保证线程安全JDK 1.8采用三级保障CAS无竞争时的快速路径synchronized哈希冲突时的同步控制volatile保证内存可见性以size操作为例// 基础计数器 private transient volatile long baseCount; // 计数器单元格 private transient volatile CounterCell[] counterCells; final long sumCount() { CounterCell[] as counterCells; long sum baseCount; if (as ! null) { for (CounterCell a : as) if (a ! null) sum a.value; } return sum; }这种分散计数的方式避免了单一计数器的竞争。5.3 扩容期间读写如何保证一致性通过ForwardingNode节点实现迁移完成的桶会被标记为ForwardingNode读操作遇到ForwardingNode会转到新表查询写操作遇到ForwardingNode会协助迁移关键代码if (fh MOVED) tab helpTransfer(tab, f);这种设计既保证了数据一致性又实现了多线程协同工作。6. 实际应用中的经验分享6.1 参数调优建议初始容量根据预估数据量设置避免频繁扩容new ConcurrentHashMap(initialCapacity)并发级别1.8版本已废弃此参数无需设置负载因子通常保持默认0.75即可6.2 常见问题排查内存泄漏注意及时清理不再使用的键值对性能瓶颈监控链表长度过长的链表会影响性能并发问题虽然线程安全但复合操作仍需额外同步6.3 最佳实践尽量使用不可变对象作为键避免在遍历时修改Map对于读多写少场景考虑使用ConcurrentHashMap的视图方法SetK keySet map.keySet();在分布式配置中心项目中我们使用ConcurrentHashMap缓存配置信息配合适当的过期策略实现了高性能的配置读取QPS达到10万。

相关文章:

【面试篇】ConcurrentHashMap 1.7与1.8:从分段锁到CAS+synchronized的演进之路

1. 从分段锁到CASsynchronized的演进背景 在Java并发编程中,HashMap是线程不安全的典型代表。当多个线程同时操作HashMap时,可能会出现数据丢失、环形链表等问题。为了解决这个问题,早期我们通常使用以下两种方式: HashTable&am…...

如何用AI技术5分钟搞定视频硬字幕提取?这个开源工具让你轻松生成SRT字幕文件

如何用AI技术5分钟搞定视频硬字幕提取?这个开源工具让你轻松生成SRT字幕文件 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含…...

Adobe-GenP:探索Adobe全家桶功能解锁的智能解决方案

Adobe-GenP:探索Adobe全家桶功能解锁的智能解决方案 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP是一款专为Adobe Creative Cloud用户设计…...

KeyMapper终极指南:重新定义Android设备按键功能的完整教程

KeyMapper终极指南:重新定义Android设备按键功能的完整教程 【免费下载链接】KeyMapper An Android app to remap the buttons on your devices 项目地址: https://gitcode.com/gh_mirrors/ke/KeyMapper 你是否曾想过自定义Android设备的按键功能&#xff1f…...

Docker Compose多项目管理利器:compose-skill配置与实战指南

1. 项目概述:一个被低估的Docker Compose技能管理工具如果你和我一样,日常工作中大量使用Docker Compose来编排本地开发环境、测试服务栈,甚至是一些轻量级的生产部署,那你一定遇到过这样的场景:手头同时维护着好几个项…...

dnGrep搜索结果分析与报告生成:如何导出和分享搜索数据

dnGrep搜索结果分析与报告生成:如何导出和分享搜索数据 【免费下载链接】dnGrep Graphical GREP tool for Windows 项目地址: https://gitcode.com/gh_mirrors/dn/dnGrep dnGrep是一款强大的Windows图形化GREP搜索工具,它不仅能够快速搜索文件内容…...

ClosureTree 在企业级应用中的最佳实践:高效构建 ActiveRecord 层级模型

ClosureTree 在企业级应用中的最佳实践:高效构建 ActiveRecord 层级模型 【免费下载链接】closure_tree Easily and efficiently make your ActiveRecord models support hierarchies 项目地址: https://gitcode.com/gh_mirrors/cl/closure_tree ClosureTree…...

ARM Cortex-R7低功耗架构设计与动态RAM保留技术

1. ARM Cortex-R7低功耗架构设计精要 在嵌入式实时系统中,功耗优化始终是工程师面临的核心挑战。ARM Cortex-R7 MPCore处理器通过创新的动态RAM保留技术,为工业控制、汽车电子等实时应用场景提供了高性能与低功耗的完美平衡方案。这套机制的精妙之处在于…...

基于Dify工作流构建游戏客服多智能体协作系统实践

1. 项目概述与核心思路最近在琢磨怎么把大语言模型(LLM)玩出点新花样,特别是结合具体的业务场景。相信不少朋友都体验过游戏里的客服,很多时候要么是预设好的关键词回复,要么就是转人工等半天。我就想,能不…...

【限时解密】SITS大会未公开议程泄露:下一代缓存协议Cache-LLMv2将于Q3强制接入HuggingFace生态?

更多请点击: https://intelliparadigm.com 第一章:大模型缓存策略优化:SITS大会 在2024年SITS(Scalable Intelligence & Trustworthy Systems)大会上,大模型推理缓存成为性能优化的核心议题。与传统We…...

Google Translate PHP测试驱动开发:确保翻译质量的最佳实践指南

Google Translate PHP测试驱动开发:确保翻译质量的最佳实践指南 【免费下载链接】google-translate-php 🔤 Free Google Translate API PHP Package. Translates totally free of charge. 项目地址: https://gitcode.com/gh_mirrors/go/google-transla…...

PS2游戏逆向工程:从MIPS机器码到x86重编译的实践解析

1. 项目概述:一个逆向工程与代码重编译的实践最近在逆向工程和游戏修改社区里,一个名为ajitmohapatr/ps2-recomp-Agent-SKILL的项目引起了我的注意。乍一看这个标题,充满了特定领域的“黑话”——“PS2”指向了经典的PlayStation 2游戏主机&a…...

code-outline:为AI编程助手设计的代码结构导航工具,节省90% Token消耗

1. 项目概述:为AI编程助手打造的代码结构导航仪如果你和我一样,日常开发中重度依赖像Claude Code、Cursor Agent或者Aider这类AI编程助手,那你肯定遇到过这个痛点:想让AI帮你理解一个陌生项目,或者修改一个大型文件里的…...

2026 技术趋势预测:从 GTC 大会透视 AI 工业化,开发者机遇与全新突破

AI-Skills技能包一键调用:https://ai-skills.ai/?inviteCodeS2JV3NCK 摘要 以英伟达 GTC 全球技术大会为行业风向标,2026 年科技产业正式告别大模型概念内卷,全面迈入AI 工业化落地、算力架构革新、智能体普及、物理 AI 深耕的全新周期。技…...

AI 短视频运营技能包|选题 + 爆款 + 增长全流程 AI 辅助

AI 短视频运营技能包:https://ai-skills.ai/?inviteCode=S2JV3NCK AIGC短视频制作教程:https://pan.baidu.com/s/1usF3eo43h2k91m6R6ycDpQ?pwd=ufkk 目录 摘要 前言 一、技能包概述 二、核心功能详解 1. 赛道定位分析 2. 内容方向规划 3. 热门趋势追踪 4. 优质选题…...

基于MCP协议的Burp Suite AI安全测试插件部署与应用实战

1. 项目概述:当Burp Suite遇见MCP,安全测试的“智能副驾”来了如果你是一名Web安全测试工程师或者渗透测试人员,Burp Suite这个名字对你来说,就像木匠手里的锤子一样熟悉。它几乎是手动安全测试的代名词,从拦截代理到漏…...

告别DCOM配置烦恼:用Python2.7 + OpenOPC的Open模式轻松搞定跨平台OPC-DA数据采集

工业数据采集新范式:Python2.7OpenOPC Gateway的轻量化实践 在工业自动化领域,数据采集系统如同神经末梢,将现场设备的实时状态转化为可分析的数字信号。传统OPC-DA方案依赖Windows平台的DCOM组件,配置复杂度与跨平台限制成为工程…...

互联网音频播放器技术演进与Xilinx可编程逻辑应用

1. 互联网音频播放器的技术演进与市场背景2000年初,互联网音频播放器市场正处于爆发式增长的前夜。当时最引人注目的产品当属Diamond Multimedia推出的Rio PMP-300便携式MP3播放器,这款设备彻底改变了人们获取和欣赏音乐的方式。作为第一代互联网音频硬件…...

忆阻器神经形态计算与模块化建模技术解析

1. 忆阻器与神经形态计算基础忆阻器(Memristor)作为继电阻、电容、电感之后的第四种基本电路元件,其核心特性在于阻值会"记忆"过往通过的电荷量。这种记忆特性源于器件内部的可逆物理变化,例如离子迁移、氧空位形成或聚…...

多模态大语言模型如何优化多机器人系统协同

1. 多模态大语言模型驱动的多机器人系统架构设计多模态大语言模型(MLLM)正在彻底改变多机器人系统的协同工作方式。这种新型架构通过将自然语言理解、多模态感知和分布式决策能力深度融合,使机器人团队能够像人类工作组一样理解复杂指令并自主…...

创业公司利用Taotoken多模型能力进行A/B测试以优化产品效果

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 创业公司利用Taotoken多模型能力进行A/B测试以优化产品效果 对于AI产品创业团队而言,选择合适的大模型是产品成功的关键…...

docker-maven-plugin 源码解析:深入理解插件架构与实现原理

docker-maven-plugin 源码解析:深入理解插件架构与实现原理 【免费下载链接】docker-maven-plugin Maven plugin for running and creating Docker images 项目地址: https://gitcode.com/gh_mirrors/doc/docker-maven-plugin 一、插件核心架构概览 docker-…...

通过审计日志追溯团队内每个API Key的详细使用记录

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过审计日志追溯团队内每个API Key的详细使用记录 在团队协作使用大模型API时,一个常见的管理难题是:如何…...

应对AIGC检测算法:论文初稿怎么做结构级优化?附实测工具避坑指南

写文章现在最怕什么?查重?不,现在的风向变了——最怕的是AI率太高。 现在越来越多学校开始严查aigc报告,只要被判定AI率过重,直接打回重写甚至影响答辩资格。很多同学为了降低ai率,四处寻找各种免费降ai率…...

如何快速掌握FunClip:阿里开源AI视频剪辑的完整指南

如何快速掌握FunClip:阿里开源AI视频剪辑的完整指南 【免费下载链接】FunClip Open-source, accurate and easy-to-use video speech recognition & clipping tool, LLM based AI clipping intergrated. 项目地址: https://gitcode.com/GitHub_Trending/fu/Fu…...

ComfyUI MixLab节点库:提升AI图像工作流控制与自动化能力

1. 项目概述:一个为ComfyUI注入新活力的节点库如果你和我一样,是个深度依赖ComfyUI进行AI图像工作流搭建的创作者,那你一定经历过这样的时刻:面对一个复杂的创意想法,却发现官方节点或者现有社区节点库的功能组合起来总…...

拆解一颗BGA芯片:从X光影像到金相切片,深度剖析焊点失效的微观世界

拆解一颗BGA芯片:从X光影像到金相切片,深度剖析焊点失效的微观世界 走进失效分析实验室的洁净间,空气中弥漫着异丙醇的淡淡气味。工作台上摆放着一块刚送检的通信设备主板——客户反馈在高温环境下频繁出现信号丢失,初步排查锁定在…...

基于Bing搜索的GPT智能体:实现大语言模型实时联网搜索

1. 项目概述:一个基于Bing搜索的GPT智能体 最近在GitHub上闲逛,发现了一个挺有意思的项目,叫 bujnlc8/gptbing 。光看名字,你可能会觉得这又是一个“GPT套壳”应用,无非是把OpenAI的API包装一下。但如果你仔细琢磨一…...

Ciao TLS证书监控:如何避免SSL证书过期导致的服务中断

Ciao TLS证书监控:如何避免SSL证书过期导致的服务中断 【免费下载链接】ciao HTTP checks & tests (private & public) monitoring - check the status of your URL 项目地址: https://gitcode.com/gh_mirrors/ci/ciao 在当今数字化时代,…...

独立开发者如何用AI验证创业点子:15分钟完成市场分析与风险评估

1. 项目概述:一个为独立开发者打造的AI创业点子验证伙伴如果你和我一样,是个喜欢自己动手鼓捣点东西的独立开发者,那你肯定也经历过这个阶段:脑子里冒出一个自认为绝妙的点子,兴奋地花上几周甚至几个月把它做出来&…...