Java中 ConcurrentHashMap 的 transfer 扩容方法怎么协同多线程并发帮助扩容

云涛小哥_2904

云涛小哥_2904

2026-07-15

677人浏览

原创

concurrenthashmap的transfer方法通过任务分片、forwardingnode标记和sizectl协调三重机制实现多线程无锁扩容:transferindex原子递减分配桶区间,fwd节点标识已迁移桶以保障读写不阻塞,sizectl负值编码扩容状态与参与线程数。

java中 concurrenthashmap 的 transfer 扩容方法怎么协同多线程并发帮助扩容

ConcurrentHashMap 的 transfer 方法通过“任务分片 + 状态协作 + 节点标记”三重机制,让多个线程安全、无锁、高效地共同完成扩容,而不是排队等待或互相阻塞。

用 transferIndex 动态划分迁移任务区域

扩容开始后,所有参与线程共享一个 volatile int transferIndex,它记录**下一个待分配的桶索引起点**。每个线程通过 CAS 原子递减该值,领取一段连续的桶区间(如 [i, bound)),避免重复处理:

  • 初始 transferIndex = oldTab.length(比如 32)
  • 线程 A CAS 成功将它改为 16 → 领取区间 [16, 32)
  • 线程 B 接着 CAS 成功改为 0 → 领取区间 [0, 16)
  • 后续线程发现 transferIndex ≤ 0,说明任务已分完,转为“协助者”角色

用 ForwardingNode 标记已完成迁移的桶

当某个桶(如 tab[i])被迁移完毕,会用 CAS 将其头节点替换为 ForwardingNode(转发节点),该节点持有对新表 nextTable 的引用:

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载
  • 后续任何线程对该桶的 get 或 put 操作,看到 ForwardingNode 就直接跳转到 nextTable[i] 或 nextTable[i + n] 查找
  • 这保证了读操作零阻塞,写操作也能立即感知迁移进度
  • ForwardingNode 是线程安全的“完成信号”,无需加锁即可判断桶状态

用 sizeCtl 协调扩容生命周期和线程数

sizeCtl 是核心协调变量,它的值编码了当前扩容阶段和参与线程数:

  • sizeCtl = -(1 + N):表示有 N 个线程正在扩容(如 -3 表示 2 个线程在搬数据)
  • 新线程想加入扩容时,先检查 sizeCtl ,再尝试 CAS 增加计数(<code>sc + 1)
  • 若达到最大并发线程数(MAX_RESIZERS)或迁移已结束(transferIndex == 0),则放弃协助
  • 最后一个完成任务的线程负责清理 nextTable、更新 table 引用,并重置 sizeCtl 为新阈值

协助线程如何“帮一把”而不冲突

不是所有线程都从头抢任务。当线程在 put 中遇到 ForwardingNode,会主动调用 helpTransfer 协助:

  • 它不重新申请大块区间,而是从自己要插入的 key 对应的旧桶位置开始,**逆序扫描附近未完成的桶**(如 i−1, i−2…)
  • 对每个桶加 synchronized (tab[i]) 锁(仅锁当前桶头节点),确保迁移链表/红黑树时无竞争
  • 迁移时按高位 bit 拆分:原桶中节点根据 hash 的最高位是 0 还是 1,分别放入 nextTable[i] 和 nextTable[i + n]

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

9497

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

6642

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

5912

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1044

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

868

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1236

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2489

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19831

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1135

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习