ConcurrentHashMap的扩容为了提高效率,是多线程并发

每个线程控制一部分范围节点的扩容(根据cpu与数组长度确定控制多大范围)

有两个核心参数

sizeCtl:标记扩容状态 负数时代表正在扩容,存储量参与扩容的线程数,正数代表出发扩容的阈值

transferIndex:表示当前等待迁移的旧表的最大索引(由高到低迁移 )若map数组长度为16则就该值的初时值是15

需要注意的是进行扩容的线程并不是Map自己创建的,而是抓的壮丁!谁触发,谁就被抓来协助扩容。

既然是多线程并发,那就一定是每个线程负责一部分,怎么确定哪些线程负责那些部分,避免重复迁移呢?这就要用到transferIndex,

所有线程尝试去获取自己负责的部分时,都要尝试cas修改这个值,注意每次的获取是分块的,有一个stide 每个线程至少是16个,即16个桶,cas修改transferIndex后就开始迁移元素。

元素的迁移过程中,线程会依次获取自己负责范围内的锁桶,注意不是一口气全拿,而是迁移一个拿一个,迁移完就释放,确保其他线程可正常读写还没有被迁移的桶。迁移完后的桶的头结点会被标记成ForwardingNode,表示该桶已被迁移,此时若有线程读取该桶的数据,则会到新表中取查询。

迁移时也会根据高低位来判断是否要迁移,将旧桶的链表拆分为两个链表(低位链表和高位链表),分别放到新表的 i和 i + oldCapacity位置。

​红黑树迁移​​:类似链表,但需检查拆分后的节点数量,若小于 UNTREEIFY_THRESHOLD(默认 6),则退化为链表

迁移完成前并不会真正断开旧表对元素的引用,这样对与正在迁移的桶,可以直接get其中的元素

最后完成扩容后会用nexttable 替换旧表

并修改sizeCtl会新容量的0.75倍

迁移过程中的put和get

get:若未被迁移直接读,被迁移(发现头结点是ForwardingNode,会跳转到对应的新表节点)从新表中读

put:会主动协助扩容,写操作一定要获取到桶锁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95943.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95943.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95943.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud Gateway 进行集群化部署

如果将 Gateway 单独部署为一个服务而不做任何高可用处理,它确实会成为一个单点故障(SPOF, Single Point of Failure)。如果这个唯一的 Gateway 实例因为服务器宕机、应用崩溃、部署更新或其他任何原因而不可用,那么整个系统的所有…

计算机网络:以太网中的数据传输

以太网中,数据的传输依赖于一系列标准化的技术规范,核心包括帧结构封装、介质访问控制机制和物理层编码技术,具体如下: 1. 以“帧(Frame)”为基本传输单元 以太网在数据链路层将网络层的数据包(…

元器件--USB TypC接口

USB TypC接口下图这些都是USB接口A口与B口的区别USB A口和B口最初由USB-IF在1996年引入。根据当时的USB协议,A口主要用于主设备(如电脑),而B口则用于从设备(如打印机和摄像头)。随着USB-C接口的日益普及&am…

多线程之HardCodedTarget(type=OssFileClient, name=file, url=http://file)异常

多线程之HardCodedTarget(typeOssFileClient, namefile, urlhttp://file)异常 摘要: 文档描述了多线程环境下调用Feign客户端OssFileClient时出现的HardCodedTarget异常。异常发生在异步保存文件到ES时,Feign调用未返回预期结果而直接打印了客户端对象。…

计算机视觉(十二):人工智能、机器学习与深度学习

人工智能 (AI):宏大的目标 人工智能是最广泛、最宏大的概念,它的目标是让机器能够模仿人类的智能行为,例如: 推理:像下棋程序一样,通过逻辑来做决策。规划:为实现一个目标而制定步骤&#xff0c…

容器元素的滚动条回到顶部

关闭再打开后,容器元素的滚动条回到顶部解决方法:1、通过打开开发者工具(F12),找到滚动条所属元素为 el-textarea__inner,其父类 class"el-textarea content"2、代码,通过元素的方法 …

分布式专题——2 深入理解Redis线程模型

1 Redis 简介 1.1 Redis 是什么? Redis 全称 Remote Dictionary Server(远程字典服务),是一个开源的高性能 Key-Value 数据库; 官网:Redis - The Real-time Data Platform; 引用官网上的⼀个…

simd学习

如何查看cpu是否支持simd?# 检查特定指令集 grep -o avx2 /proc/cpuinfo | head -1 # 检查AVX2 grep -o sse4 /proc/cpuinfo | head -1 # 检查SSE4 grep -o avx512 /proc/cpuinfo | head -1 # 检查AVX512gcc编译选项,增加支持simd-mavx2 -D__AVX2__SS…

LabVIEW汽车发动机振动测试

以某型号四缸汽油发动机为测试对象,借助 LabVIEW 平台与高精度数据采集硬件,开展发动机全工况振动测试。通过实时采集缸体、曲轴箱关键部位振动信号,分析振动特征与故障关联,验证发动机运行稳定性,为后期优化设计提供数…

android 四大组件—Service

启动服务startService//启动服务,通过类名 Intent intent new Intent(this, WiFiAutoLinkService.class); startService(intent); //通过字符串启动 Intent intent new Intent(); intent.setAction("com.launcher.app"); intent.setPackage("com.l…

https + 域名 + 客户端证书访问模式

项目使用金融云部署,对外暴露IP访问,因安全合规要求必须使用域名访问,但公司又不提供域名。故,改为 https 域名 客户端证书双向认证 访问模式,大大提升安全性。 1. 密钥文件类型 .key、.csr、.cer(或 .cr…

ICPC 2023 Nanjing R L 题 Elevator

[ProblemDiscription]\color{blue}{\texttt{[Problem Discription]}}[Problem Discription] 来源:洛谷。侵权则删。 [Analysis]\color{blue}{\texttt{[Analysis]}}[Analysis] 贪心。优先运送楼层高的货物,在能装下的情况下尽量多装。 因为运送货物的代价…

81-dify案例分享-零代码用 Dify 使用梦 AI 3.0 多模态模型,免费生成影视级视频

1.前言 即梦AI作为字节跳动旗下的AI绘画与视频生成平台,近年来不断推出新的模型和功能,以提升用户体验和创作能力。 即梦AI 3.0是即梦AI的最新版本,于2025年4月发布,标志着其在中文生图模型上的重大升级。该版本不仅在中文生图能…

SQL 进阶指南:视图的创建与使用(视图语法 / 作用 / 权限控制)

在 SQL 操作中,你是否遇到过 “频繁查询多表关联的固定结果”“不想让他人看到表中的敏感字段” 这类问题?比如 “每周都要查‘技术部员工的姓名、职位、薪资’”,每次都写多表关联语句很麻烦;又比如 “给实习生开放数据查询权限&…

【全部更新完毕】2025数学建模国赛C题思路代码文章高教社杯全国大学生数学建模-NIPT 的时点选择与胎儿的异常判定

B题全部更新完毕 包含完整的文章全部问题的代码、结果、图表 完整内容请看文末最后的推广群NIPT 的时点选择与胎儿的异常判定 摘要 在问题一中,我们以无创产前检测(NIPT)数据为研究对象,围绕“胎儿 Y 染色体浓度”(记为 (V)) 随孕…

Redis(43)Redis哨兵(Sentinel)是什么?

Redis Sentinel(哨兵)是一种用于管理 Redis 实例的高可用性解决方案。它提供了监控、通知和自动故障转移等功能,确保 Redis 服务在发生故障时能够自动恢复,提供高可用性和可靠性。以下是详细介绍 Redis Sentinel 的功能及其代码示…

蓓韵安禧DHA纯植物藻油纯净安全零添加守护母婴健康

在母婴健康领域,选择合适的营养补充品至关重要。纯植物藻油DHA源自纯净藻类,有效规避了海洋重金属污染的风险,确保安全无隐患。配方坚持零添加香精、色素和防腐剂,避免不必要的化学物质摄入,让妈妈和宝宝更安心。同时&…

钉钉 AI 深度赋能制造业 LTC 全流程:以钉钉宜搭、Teambition 为例

制造业 LTC 流程痛点剖析​在制造业,线索到现金(LTC,Lead to Cash)的全流程包含从潜在客户线索的发现、商机培育、销售转化、订单执行到最终收款的一系列复杂环节。传统制造业在这一流程中面临诸多挑战:客户需求的多样…

理解UE4中C++17的...符号及enable_if_t的用法及SFINAE思想

下面是一段C17的代码&#xff1a;//函数1&#xff1a;template <typename... BufferTypes,std::enable_if_t<std::conjunction<CanAppendBufferType<std::decay_t<BufferTypes>>...>::value> * nullptr> inline explicit FCompositeBuffer(Buff…

安全419正式公布《甲方安全建设精品采购指南》案例首推运营商行业数据安全核心推荐厂商

在数字经济加速渗透与《网络数据安全管理条例》全面实施的双重背景下&#xff0c;运营商作为数据要素流通的核心枢纽&#xff0c;其安全防护体系建设已成为数字基础设施保障的关键环节。近日&#xff0c;安全 419 正式公布《甲方安全建设精品采购指南》&#xff0c;从近 300 个…