ConcurrentHashMap总结

发布时间:2026/10/30 2:25:54

ConcurrentHashMap总结 HashMap是最常用的键值对容器但多线程并发 put() 操作会出现数据丢失等问题是线程不安全的Hashtable 则是在所有方法上加synchronized锁住整个哈希表。这就好比大型货舱只有一把大锁。只要有一个人入库存取货物其余所有人排队等待。并发量高的时候大量线程阻塞性能极差。于是ConcurrentHashMap应运而生既能保证线程安全又不会像 Hashtable 那样串行排队。一、演化之路从“分段锁”到“CAS synchronized”JDK1.7Segment数组 HashEntry数组 单向链表把一个大的Map切成多个SegmentSegment继承了ReentrantLock。简单来说就是把一个大数组切成了 16 段默认每段配一把锁。不同段的线程互不影响。但是锁的粒度偏大内存开销也大。而且Segment 数组一旦初始化不可扩容只有 Segment 内部的 HashEntry 数组支持扩容。JDK1.8Node数组 哈希表 单向链表 红黑树哈希表为空无哈希冲突使用CAS 无锁写入不加锁有哈希冲突synchronized锁住链表头洁点 / 红黑树根节点。最大并发量等于数组长度数组长度默认为16如果链表长度 8并且数组容量 64容量小于64数组扩容链表转为红黑树节点数 6红黑树退化为链表查询复杂度由 O (n) 降到 O (logn)。二、源码剖析1 禁用null值2 初始化CAS 抢锁 (initTable)3 插入数据1无锁插入 (putVal)2synchronized锁插入4 多线程协助扩容1任务分配多个线程用 CAS 争抢全局变量transferIndex从数组尾部往前认领一段连续的数组下标。 CAS 保证同一段下标区间只会被一个线程领取不会重复干活。2头结点加锁synchronized (f) 锁住该数组下标头节点哈希表不同下标位置可以同时进行操作并发高。3链表拆分哈希表旧数组长度n是 2 的幂扩容也是2倍扩容hashn 只有两种结果hash n 0放到新数组 i位置不变低位链表 lnhash n ! 0放到新数组 in高位链表 hn4收尾所有参与扩容的线程都干完活后进入finishing阶段。完整扫一遍旧数组确认全部下标都标记了 ForwardingNode替换 table 引用为nextTab扩容生效后重置SIZECTL为新的扩容阈值。5 获取数据get()三、总结1、get()方法全程无锁依靠 volatile 保证可见性读的效率很高只有写 put / 扩容才会用到 synchronizedCAS。2、get()会读到脏数据volatile 保证可见性能读到已经完成写入的最新节点但并发场景下get 和 put 同时执行仍然存在读到旧值的并发问题读和写并发不保证原子性3、HashMap的key、value可以 nullConcurrentHashMap的key、value都不允许nullget (key) 返回 null无法区分是key不存在还是存入的value本身就是 null。4、ConcurrentHashMap适合
延伸阅读

更多相关文章

2026/10/30 2:25:54

记一次 PGP 驱动残留导致的开机蓝屏修复

输对 BitLocker 48 位恢复密钥,磁盘显示已解锁,然后——蓝屏,无限循环。朋友的笔记本就这么折腾了我一整天,最后发现元凶是一个 2010 年的老软件残留驱动。这篇把从 BCD 重建到 UpperFilters 残留排查的完整过程记下来&#xff0c…

2026/10/30 2:25:54

边缘盒子跑生图:JetPack 6.0 + Orin AGX 部署轻量版全流程

边缘盒子跑生图:JetPack 6.0 Orin AGX 部署轻量版全流程 图像生成模型正在经历一轮"加速瘦身":从 40 步、带 CFG 的重推理,压缩到 4~8 步、无 CFG 的轻量蒸馏。社区里 Qwen-Image 加速 LoRA、Lightning 版的讨论热度居高不下&…

2026/10/30 2:25:54

向 6k Star 开源项目提 PR 全记录

想给开源项目做贡献,但对着 6k star 的仓库不知从何下手?怕代码写得不够好被拒?这篇是我第一次向大型开源项目提 PR 的完整记录:从选项目、找切入点,到本地验证、绕过权限坑,最终 PR #716 当天被合并。核心…

2026/10/30 4:46:06

第九章 结构体、枚举类型和链表

第九章 结构体、枚举类型和链表1. 结构体1.1 项目引入-成绩系统第二次改版先把出事那版摊开。三个数组并排&#xff0c;加个班级字段之后长这样。#include <iostream> #include <string> using namespace std;int main() {string names[5] { "张三", &q…

2026/10/29 17:05:52

全国计算机二级C语言真题PDF高效刷题指南

简介&#xff1a;这份PDF是全国计算机二级C语言考试的试题与答案解析&#xff0c;专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/29 17:06:02

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介&#xff1a;一份以实战为导向的Python爬虫入门资源&#xff0c;面向具备基本编程基础、希望快速掌握网络数据抓取的初学者&#xff0c;可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档&#xff0c;完整演示从网页中提取 标题…

2026/10/29 17:06:13

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介&#xff1a;这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档&#xff0c;压缩包大小七十八KB&#xff0c;内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开&#xff1a;先构造一个极点位于单位圆内…

2026/10/30 0:00:46

NCP1342高频准谐振反激控制器:从设计约束到验收的完整方案

简介&#xff1a;NCP1342 高频准谐振反激控制器应用介绍译文文档&#xff0c;面向电源设计工程师、硬件研发人员及开关电源学习者&#xff0c;帮助读者跨越英文原版资料的语言门槛&#xff0c;系统理解这款高集成度 QR Flyback 控制器的设计要点。文档围绕芯片核心特性展开&…

2026/10/30 0:00:46

NCP1342准谐振反激电源设计:从选型到验收的全流程解析

简介&#xff1a;这份文档面向电源设计工程师与开关电源学习者&#xff0c;系统梳理NCP1342高频准谐振反激控制器的应用要点&#xff0c;帮助读者快速理解这款高集成度离线电源变换器控制芯片的工作机制与设计方法。内容涵盖芯片核心特性、引脚功能定义、电气特性参数表、最大额…

2026/10/30 0:00:46

Web系统自动登出机制设计与实现全解析

1. 系统自动登出机制的设计初衷在各类Web应用和后台管理系统中&#xff0c;自动登出功能早已成为标配。这个看似简单的功能背后&#xff0c;实际上涉及用户安全、资源管理和体验优化的多重考量。作为从业十多年的老开发&#xff0c;我见过太多因为登出逻辑设计不当导致的安全事…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑