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…...
保姆级教程:用Proteus 8.13和STM32F103C8T6复刻一个烟雾报警器仿真(附源码调试心得)
从零到一:Proteus与STM32烟雾报警器仿真全流程实战指南 第一次打开Proteus时,那个蓝色界面和密密麻麻的元件库让我既兴奋又茫然。作为一个刚接触嵌入式仿真的电子爱好者,我原本以为有了开源文件和代码就能轻松复现一个烟雾报警器仿真项目&…...
Flutter状态管理实战:ChangeNotifier与Provider的完美搭配(附完整代码)
Flutter状态管理实战:ChangeNotifier与Provider的完美搭配 在Flutter开发中,状态管理一直是构建复杂应用的核心挑战。当UI需要根据数据变化动态更新时,如何高效、优雅地管理状态流转,直接决定了应用的性能和可维护性。本文将深入…...
隐私保护×效率提升:开源OCR工具如何重构3大行业文本处理流程
隐私保护效率提升:开源OCR工具如何重构3大行业文本处理流程 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多…...
PDB文件管理实战:用符号服务器加速团队协作调试(含VS2022配置示例)
PDB文件管理实战:构建企业级符号服务器加速团队协作调试 当开发团队规模超过10人时,调试符号管理就会从技术问题升级为协作难题。想象这样的场景:周五下午5点,QA报告生产环境出现崩溃转储,开发团队需要立即分析。但当工…...
08_Claude Code之高级工作流与自动化:循环、调度与并行批处理
08 Claude Code之高级工作流与自动化:循环、调度与并行批处理 Claude Code 的真正价值在于自动化能力,而不仅仅是对话工具。本文深度讲解 Plan Mode 的量化对比(多文件重构成功率从62%到89%)、非交互批处理脚本、并行处理架构、CI…...
新手入门指南:在快马平台用万文通思路打造你的第一个文本转换网页
今天想和大家分享一个特别适合编程新手的实践项目——用万文通思路在InsCode(快马)平台快速搭建文本转换网页。这个项目完全不需要复杂的环境配置,打开浏览器就能完成,特别适合想体验完整开发流程的初学者。 项目核心功能设计 这个网页的核心功能非常简单…...
如何用代码思维提升90%图表效率?揭秘Mermaid的可视化革命
如何用代码思维提升90%图表效率?揭秘Mermaid的可视化革命 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-edi…...
c++阿克曼函数详解
不爱吃饭的蓝胖子要开始整活了!!!大家好,我是蓝胖子!好久不见,倍感思念!今天带来的是--C阿克曼函数~~希望你能看到最后,有惊喜哈!正片开始 ——————————————…...
Llama-3.2-3B入门指南:Ollama部署详解,从安装到生成第一段文字
Llama-3.2-3B入门指南:Ollama部署详解,从安装到生成第一段文字 1. 认识Llama-3.2-3B:轻量级多语言文本生成专家 Llama-3.2-3B是Meta公司推出的开源大语言模型,属于Llama 3.2系列中的3B参数版本。这个模型特别适合需要快速响应和…...
Synopsys AXI VIP实战:如何用reorder和delay配置模拟真实SoC总线行为
Synopsys AXI VIP实战:用reorder与delay构建高保真SoC总线模拟环境 在SoC验证领域,AXI总线协议的复杂性常常成为验证工程师面临的主要挑战。当CPU通过Cache访问低速外设时,总线上的竞争、延迟和乱序响应会形成难以预测的行为模式。Synopsys A…...
