concurrentHashMap线程安全实现的原理
1. Segment 数组
ConcurrentHashMap 内部维护一个 Segment 数组,每个 Segment 都是一个小型的 HashMap。Segment 继承自 ReentrantLock,因此每个 Segment 都是一个可重入锁。
2. 并发级别
ConcurrentHashMap 在构造时可以指定并发级别(concurrencyLevel),该值决定了 Segment 数组的大小。默认情况下,并发级别为 16。
3. hash 分段
当向 ConcurrentHashMap 中添加元素时,首先根据 key 的 hash 值确定该元素属于哪个 Segment。这样可以将锁的粒度缩小到 Segment 级别,而不是整个 Map。
4. 锁定 Segment
在对某个 Segment 进行写操作时,需要获取该 Segment 的锁。读操作则不需要加锁,因为读操作是在 Segment 内部进行的。
5. 扩容
当某个 Segment 中的元素数量超过阈值时,该 Segment 会进行扩容。扩容时,需要获取该 Segment 的锁,以确保线程安全。
性能优化怎么做的?
1. 分段锁(Segment Locking)
ConcurrentHashMap 将整个哈希表分成多个 Segment,每个 Segment 是一个独立的锁。这样,多个线程可以并发地访问不同的 Segment,从而减少了锁的竞争。
- 锁粒度: 通过将锁的粒度从整个 Map 降低到每个 Segment,ConcurrentHashMap 允许多个线程同时对不同的 Segment 进行读写操作。
- 并发级别: 在构造 ConcurrentHashMap 时,可以指定并发级别(concurrencyLevel),这决定了 Segment 的数量。默认值为 16,意味着最多可以有 16 个线程同时进行写操作。
2. 无锁读操作
在读操作时,ConcurrentHashMap 不需要加锁。它使用了以下机制来确保线程安全和数据一致性:
- 使用 volatile 变量: 读操作直接读取数据,使用 volatile 关键字确保内存可见性。这样,即使在没有锁的情况下,其他线程对数据的修改也能被及时看到。
- 快速访问: 由于读操作不需要加锁,多个线程可以快速地并发读取数据,极大地提高了读操作的性能。
3. CAS 操作(Compare-And-Swap)
在写操作中,ConcurrentHashMap 使用 CAS 操作来更新数据,这是一种无锁的并发控制机制。
- 原子性更新: CAS 操作可以在不加锁的情况下安全地更新值。它通过比较当前值和预期值,如果相同则更新为新值,从而确保了原子性。
- 减少锁竞争: 通过使用 CAS,ConcurrentHashMap 能够在高并发环境下减少锁的竞争,从而提高性能。
4. 扩容机制
ConcurrentHashMap 的扩容设计也经过了优化,以支持高效的并发扩容。
- 分段扩容: 当某个 Segment 的元素数量超过阈值时,仅扩容该 Segment,而不是整个 Map。这避免了在扩容期间对整个 Map 的锁定。
- 并发扩容: 在扩容过程中,允许多个线程同时进行扩容操作。通过将扩容过程分散到多个线程,减少了扩容带来的性能影响。
相关文章:
concurrentHashMap线程安全实现的原理
1. Segment 数组 ConcurrentHashMap 内部维护一个 Segment 数组,每个 Segment 都是一个小型的 HashMap。Segment 继承自 ReentrantLock,因此每个 Segment 都是一个可重入锁。 2. 并发级别 ConcurrentHashMap 在构造时可以指定并发级别(con…...
域名证书,泛域名证书,sni
文章目录 前言一、证书1.全域名证书2.泛域名证书 二、域名证书的使用1、浏览器请求域名证书流程对全域名证书的请求流程对泛域名证书的请求流程ssl client-hello携带server name 报文 2、浏览器对证书的验证流程 三、域名证书和sni 前言 本文介绍了泛域名证书和全域名证书的区别…...
Pytest夹具autouse参数使用。True表示会自动在测试中使用,而无需显式指定
1. 全局conftest文件日志记录功能 # 当前路径(使用 abspath 方法可通过dos窗口执行) current_path os.path.dirname(os.path.abspath(__file__)) # 上上级目录 ffather_path os.path.abspath(os.path.join(current_path,"../"))LOG_FILE_PATH f{ffather_path}/lo…...
Linux:归档及压缩
tar命令 • tar 集成备份工具 – -c:创建归档 – -x:释放归档 – -f:指定归档文件名称,必须在所有选项的最后 – -z、-j、-J:调用 .gz、.bz2、.xz 格式工具进行处理 – -t:显示归档中的文件清单 – -C:指定…...
jenkins 安装
jenkins安装 jenkins官网 中文网址 安装设置 所有jenkins版本 内存512M以上,10Gb磁盘;安装jdk,需要java8以上下载较新的版本,否则安装插件时可能报错版本过低 # 搜索java yum search java | grep -iE "jdk"# 安装jd…...
mysql学习教程,从入门到精通,MySQL 删除数据库教程(6)
1、MySQL 删除数据库 使用普通用户登陆 MySQL 服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库,所以我们这边使用 root 用户登录,root 用户拥有最高权限。 在删除数据库过程中,务必要十分谨慎,因为在执行删除…...
C语言:刷题日志(2)
一.币值转换 输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代…...
微带结环行器仿真分析+HFSS工程文件
微带结环行器仿真分析HFSS工程文件 工程下载:微带结环行器仿真分析HFSS工程文件 我使用HFSS版本的是HFSS 2024 R2 参考书籍《微波铁氧体器件HFSS设计原理》和视频微带结环行器HFSS仿真 1、环形器简介 环行器是一个有单向传输特性的三端口器件,它表明…...
怎么仿同款小程序的开发制作方法介绍
很多老板想要仿小程序系统,就是想要做个和别人界面功能类似的同款小程序系统,咨询瀚林问该怎么开发制作?本次瀚林就为大家介绍一下仿制同款小程序系统的方法。 1、确认功能需求 想要模仿同款小程序系统,那么首先需要找到自己想要…...
音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现
一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息࿰…...
0.91寸OLED屏幕大小的音频频谱,炫酷
(后文有详细介绍) 频谱扫描: 迷你音频频谱——频率扫描 音乐律动: 迷你音频频谱——频率扫描 迷你音频频谱——音乐2 迷你音频频谱——音乐3 一、简介 音频频谱在最小0.91寸OLED 屏幕上显示,小巧玲珑 二、应用场景 本…...
6. LinkedList与链表
一、ArrayList的缺陷 通过源码知道,ArrayList底层使用数组来存储元素,由于其底层是一段连续空间,当在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为O(n),效率比…...
Statcounter Global Stats 提供全球统计数据信息
Statcounter Global Stats 提供全球统计数据信息 1. Statcounter Global Stats2. Mobile & Tablet Android Version Market Share WorldwideReferences Statcounter Global Stats https://gs.statcounter.com/ Statcounter Global Stats are brought to you by Statcounte…...
Linux kernel中的dts dtsi dtb dtc dtb.img dtbo.img
1、问题 kernel与hsm会设置一些gpio,但是某些gpio会在kernel与hsm侧共同设置,导致最终的设置结果失败,将kernel侧在dts文件中设置的gpio注释掉之后,发现hsm设置gpio时还是失败 2、问题原因 因为dts文件不仅仅会影响kernel镜像&…...
微信小程序页面制作——个人信息
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
使用C++11的`std::async`执行异步任务:实战指南
使用C11的std::async执行异步任务:实战指南 在现代软件开发中,异步编程是提高应用程序性能和响应速度的重要手段。C11引入了std::async,使得编写异步任务变得更加简单和直观。本文将详细介绍如何使用std::async执行异步任务,并提…...
【高阶数据结构】B树、B+树、B*树
B树、B树、B*树 1. 常见的搜索结构2. B树概念3. B树的插入分析4. B树的插入实现4.1 B树的节点设计4.2 B树的部分插入实现14.3 B树的查找4.4 B树的部分插入实现24.5 插入key的过程4.7 B树的插入完整代码4.8 B树的简单验证4.9 B树的删除4.10 B树的性能分析 5. B树6. B*树7. 总结8…...
HBuilderx中vue页面引用scss样式
scss为css样式的预编译器,引入了变量、嵌入、混合、集成、引入等功能,相对于css样式,实现了样式的编程,具有更灵活的样式编写模式。 那么在HBuilderx中,“.vue”格式页面如何调用scss样式呢?详细如下&#…...
粒子群算法原理的示例介绍
一:粒子群优化算法的介绍 粒子群优化算法(PSO)是一种基于群体智能的优化算法,于1995年提出。它受到鸟群狩猎行为的启发,通过模拟鸟群或鱼群的社会行为来进行问题的求解。 基本原理 粒子群算法中,每个解决…...
GNU/Linux - Open函数使用的O_CLOEXEC flag
在 Linux 中,“O_CLOEXEC ”标志与 “open ”系统调用一起使用,用于指定在使用 “exec ”系列函数(如 “execve”、“execl ”等)执行新程序时,“open ”返回的文件描述符应自动关闭。 In Linux, the O_CLOEXEC flag i…...
DouZero AI斗地主助手:5分钟快速上手终极指南
DouZero AI斗地主助手:5分钟快速上手终极指南 【免费下载链接】DouZero_For_HappyDouDiZhu 基于DouZero定制AI实战欢乐斗地主 项目地址: https://gitcode.com/gh_mirrors/do/DouZero_For_HappyDouDiZhu 想要在欢乐斗地主中轻松取胜吗?DouZero AI斗…...
美团mtgsig签名环境模拟:Android Native层风控对抗实战
1. 这不是写个JS就能跑通的事:为什么mtgsig签名环境模拟是逆向工程里最硬的骨头“美团外卖mtgsig签名”这八个字,在安卓逆向、风控对抗、自动化测试圈子里,几乎等同于一道分水岭。它不像普通API签名那样靠抓包改参就能绕过,也不像…...
5分钟快速上手:DouYinBot抖音无水印视频解析工具终极指南
5分钟快速上手:DouYinBot抖音无水印视频解析工具终极指南 【免费下载链接】DouYinBot 该项目仅自用,不提供抖音视频下载 项目地址: https://gitcode.com/gh_mirrors/do/DouYinBot 在短视频创作火爆的今天,你是否曾为抖音视频上的水印而…...
AI视频生成“假熟练”陷阱(83%用户未察觉):3个隐藏技能断层导致输出质量长期停滞
更多请点击: https://kaifayun.com 第一章:AI视频生成工具学习曲线分析 AI视频生成工具的学习曲线呈现出显著的非线性特征:初学者可在数小时内完成基础视频合成,但要稳定产出符合商业标准的高质量内容,通常需跨越模型…...
【流体】基于matlab对沼气厂管道系统进行流体动力学设计和成本优化(最小化总年化成本TAC)【含Matlab源码 15560期】
💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞Ὁ…...
GTA5线上小助手:智能助手让你的洛圣都冒险更精彩
GTA5线上小助手:智能助手让你的洛圣都冒险更精彩 【免费下载链接】GTA5OnlineTools GTA5线上小助手 项目地址: https://gitcode.com/gh_mirrors/gt/GTA5OnlineTools 想要在《侠盗猎车手5》线上模式中获得更流畅的游戏体验吗?GTA5线上小助手为你提…...
终极鸣潮优化指南:3分钟解锁120FPS与专业抽卡分析
终极鸣潮优化指南:3分钟解锁120FPS与专业抽卡分析 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 你是否还在为《鸣潮》的60FPS帧率限制而烦恼?是否想科学分析自己的抽卡概率&#…...
LSLib:游戏资源逆向工程的架构级解决方案
LSLib:游戏资源逆向工程的架构级解决方案 【免费下载链接】lslib Tools for manipulating Divinity Original Sin and Baldurs Gate 3 files 项目地址: https://gitcode.com/gh_mirrors/ls/lslib 面对《神界:原罪》和《博德之门3》等CRPG游戏复杂…...
搭建你的第一个AIGC工作流:基于LangChain实现多步链式调用与条件分支
系列导读 你现在看到的是《从0到1构建AIGC工作流自动化平台:架构、实践与运维全指南》的第 2/10 篇,当前这篇会重点解决:通过一个可运行的最小示例,让读者快速体会工作流的本质,并掌握LangChain基础用法。 上一篇回顾:第 1 篇《AIGC工作流自动化平台技术选型与架构设计…...
破解行业共性管控难题,推动矿山安全体系迭代升级 ——基于视频孪生无感定位的矿山安全体系革新技术方案
破解行业共性管控难题,推动矿山安全体系迭代升级——基于视频孪生无感定位的矿山安全体系革新技术方案一、方案引言国内煤炭矿山长期在人员监管、灾害应急、隐患溯源、空间管控层面沉淀诸多共性难题,佩戴管控流于形式、监测数据失真失实、灾变监测体系快…...
