concurrentHashMap扩容细节

并发编程学习之ConcurrentHashMap扩容机制 一、简介 在ConcurrentHashMap中,比较复杂部分就是其扩容机制,因为涉及到多个线程分工合作完成数据迁移和key的rehash操作。 二、扩容思路 ConcurrentHashMap扩容一般分为两个步骤: 【a】Node<K,V>[] table数组的扩容,一般是扩大到原来数组大小的两倍; 【b】key的rehash以及数据的迁移:因为计算key在桶中的索引ind... 阅读详情

针对扩容和put的原理,这个问题,我在学习的时候,一直有一个疑问点:假如当前A线程已经对15这个位置扩完容了,那如果这时候B线程又对15这个位置插入了元素,要怎么处理?
通过对代码的仔细查看学习,找到了这个问题的答案

在扩容的时候,假如线程A对i这个位置扩容完成了,那线程A会把原数组中i位置,放入一个ForwardingNode对象,放入的这个对象很有讲究,也起到了很大的作用,这个和put时的一些逻辑处理有关系

扩容的思想

先说扩容的思想
在concurrentHashMap中,如果当前线程A触发了扩容的机制,线程A会开始进行扩容,在扩容的时候,涉及到一个步伐的概念,简单来说,就是加入了辅助扩容的机制,所以,此时一个线程会负责一部分数据的扩容,举个简单例子来说
1.假如当前数组中有32个位置,那线程A负责31到16这区间的元素的扩容
2.如果此时线程B来put元素,发现要put到30这个位置,发现正在被扩容,那此时就会去辅助扩容,所谓的辅助扩容,就是线程B负责15到0这个区间的扩容

在源码中,会计算一个线程所负责扩容的大小,是根据CPU核数来计算的,最小是16个,也就是说,一个线程最少负责16个位置元素的扩容

java.util.concurrent.ConcurrentHashMap#transfer

/**
* 1.这里的stride是步长,这个步长最小值是16
*/
if ((stride = (NCPU > 1) ? (n >>> 3) / NCPU : n) < MIN_TRANSFER_STRIDE)
  stride = MIN_TRANSFER_STRIDE; // subdivide range

这里是计算步长的公式,NCPU是当前CPU的核数,n是当前老数组的长度,会根据这个公式去计算
1.如果cpu核数大于1,那就(n >>> 3) / NCPU 以这个值作为步长
2.如果CPU核数小于等于1,那就以数组长度作为步长
3.如果这样计算得到的步长依旧小于16,那就把16作为步长

也就是说,如果CPU核数只有1个,并且当前数组长度大于16,那就以数组长度作为步长;如果CPU核数有多个,就会根据一个公式,计算一个阈值,如果这个值小于16,就以16作为步长


/**
 * 2.对新的table进行初始化和赋值
 * 默认扩容之后的table长度是原table的一倍
 * nextTab就是扩容之后的数组
 */
if (nextTab == null) {
   
               // initiating
    try {
   
   
        @SuppressWarnings("unchecked")
        Node<K,V>[] nt = (Node<K,V>[])new Node<?,?>[n << 1];
        nextTab = nt;
    } catch (Throwable ex) {
   
         // try to cope with OOME
        sizeCtl = Integer.MAX_VALUE;
        return;
    }
    nextTable = nextTab;
    /**
     * 这里的n是扩容之前,数组的长度
     */
    transferIndex = n
ConcurrentHashMap 扩容机制(源码解析) ConcurrentHashMap 扩容机制解析,炒鸡详细 阅读详情

相关推荐

ConcurrentHashMap中有十个提升性能的细节,你都知道吗?

历史文章推荐: HashMap面试,看这一篇就够了 七种方式教你在SpringBoot初始化时搞点事情 Java序列化的这三个坑千万要小心 Java中七个潜在的内存泄露风险,你知道几个? JDK 16新特性一览 啥?用了并行流还更慢了 InnoDB自增原理都搞不清楚,还怎么CRUD? 一些题外话 前一篇文章我们对HashMap的实现做了详细的解析和总结,这篇文章继续剖析一下ConcurrentHashMap的实现。由于ConcurrentHashMap的内容比较多,而且Java 7和Java 8两.

DD_Dddd的博客 7656

ConcurrentHashMap源码解析(jdk1.8)

ConcurrentHashMap 基于JDK1.8 ConcurrentHashMap 1. 原理解析 1.1. 重要成员变量 1.2. 实例初始化 1.3. put操作 1.3.1 put过程描述 1.3.2 hash算法 1.3.3 定位索引 1.3.4 获取table对应的索引元素f 1.4. table 扩容 1.4.1 addCount 1.4.2 treeify ...

programmer_at的专栏 4万+

Java集合类框架学习 5.3—— ConcurrentHashMap(JDK1.8)

以下内容,如有问题,烦请指出,谢谢! 现在看下1.8版本的ConcurrentHashMap,改动很大。目前本人也有些地方没有弄懂,具体来说就是扩容有关的那一块,有几个地方还不太对得上,单独理解是没问题的,联合起来发现存在些矛盾的地方。所以下面的扩容有关的,各位看官还是细看,自己也要想下。 零、主要改动 参照对象为jdk1.7的ConcurrentHashMap,当然,熟悉jdk1.

十二页的博客 1万+

ConcurrentHashMap 扩容

Java 8的引入了一些改进,其中之一与在哈希表变得太满时进行扩容或扩展有关。旨在在不需要外部同步的情况下高效处理并发读写操作。在Java 8中,引入了一种新的机制来进行扩容和重新哈希,以提高性能并减少扩容过程中的争用。这个机制被称为"TreeNodes",当哈希表中的一个存储桶变得过于拥挤时会使用它。以下是Java 8中:当创建时,需要指定一个初始容量。哈希表从这个容量开始,并创建一个基于指定容量的存储桶数组。:负载因子是一个阈值,用于确定何时应该对进行扩容。

学无止境 830

经典密码体制(上)

头歌

shannidawang的博客 3086

矢量网络分析仪VNA的校准之SOLT方法

作者:杭州冥鸿电子科技有限公司 邮箱:huanglong@deepelec.com S参数的测量方法有两种,一种是基于扫频测量的原理(VNA),另外一种是基于快沿阶跃响应的原理(TDR)。 下图是VNA的原理框图,主要包括以下部分: (1)激励信号源:提供感兴趣的频率范围内的入射信号; (2)信号分离装置:含功分器和定向耦合器,分离出入射,反射和传输信号; (3)接收机:...

u010018619的博客 2万+

[FPGA高速以太网]基于Verilog与1G/2.5G Ethernet PCS/PMA IP核的2.5G UDP通信实战

本文详细介绍了基于FPGA与1G/2.5G Ethernet PCS/PMA IP核实现2.5G UDP通信的完整实战方案。文章以黑金AX7A200开发板为硬件平台,深入讲解了从硬件选型、IP核配置、Verilog测试逻辑编写到系统调试与性能验证的全过程,重点剖析了利用SGMII接口与GTP收发器实现高速数据传输的关键技术与避坑指南,为FPGA高速以太网应用开发提供了宝贵经验。

sql99的博客 568

从封装到先进封装:一文讲透Chiplet、2.5D/3D堆叠与系统集成

封装是芯片产业链中连接硅片与电路板的桥梁,承担物理保护、电气连接、散热与机械支撑等核心任务。传统封装从DIP、QFP发展到BGA,通过提升引脚密度满足早期性能需求。随着摩尔定律放缓,单纯缩小晶体管尺寸难以为继,先进封装应运而生,其核心理念从“封装单颗芯片”转向“系统级高密度集成”。扇出型封装、2.5D硅中介层、3D堆叠、Chiplet和系统级封装等技术,通过微米级互连和垂直堆叠,大幅提升I/O密度与带宽,成为AI芯片、HBM存储、高性能计算等领域的关键支撑。本文梳理先进封装的技术演进、分层架构与工程难点,帮

weixin_29185167的博客 367

拜耳阵列(Bayer Pattern)以及常见彩色滤波矩阵(CFA)

本文介绍了拜耳阵列的工作原理(Bayer Pattern)以及常用的彩色滤波矩阵(CFA)

风一样的男子(quinta)的博客 7121

新政下的绿电直连项目经济性分析:模式创新与价值重构

随着全球气候治理与低碳转型进程不断加速,绿电直连作为新能源就近消纳的创新模式,正成为破解新能源消纳瓶颈、规避碳关税壁垒的核心路径。2025年9月,国家发展改革委、国家能源局发布《关于完善价格机制促进新能源发电就近消纳的通知》(1192号文),为绿电直连项目的经济性分析与效益测算提供了明确的政策依据。本文将基于新政框架,深入解析绿电直连项目的经济性影响因素、盈利模式与优化路径,并结合案例与量化模型,为项目投资决策提供系统参考。

getusushu的博客 140

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: 线上问题:大事务问题
下一篇: spring事务失效二:业务代码捕获异常
小小少年_
博客等级 码龄10年 63粉丝 146原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值