ConcurrentHashMap支持并发扩容,实现方式是,把Node数组进行拆分,让每个线程处理自己的区域,假设table数组总长度是64,默认情况下,那么每个线程可以分到16个bucket。

然后每个线程处理的范围,按照倒序来做迁移

通过for自循环处理每个槽位中的链表元素,默认advace为真,通过CAS设置transferIndex属性值,并初始化i和bound值,i指当前处理的槽位序号,bound指需要处理的槽位边界,先处理槽位31的节点; (bound,i) =(16,31) 从31的位置往前推动。

假设这个时候ThreadA在进行transfer,那么逻辑图表示如下

在当前假设条件下,槽位15中没有节点,则通过CAS插入在第二步中初始化的ForwardingNode节点,用于告诉其它线程该槽位已经处理过了;

ConcurrentHashMap的源码分析-扩容过程图解相关推荐

  1. ConcurrentHashMap的源码分析-CounterCells初始化图解

    初始化长度为2的数组,然后随机得到指定的一个数组下标,将需要新增的值加入到对应下标位置处 transfer扩容阶段 判断是否需要扩容,也就是当更新后的键值对总数baseCount >= 阈值si ...

  2. ConcurrentHashMap的源码分析-扩容结束以后的退出机制

    如果线程扩容结束,那么需要退出,就会执行transfer方法的如下代码 //i<0说明已经遍历完旧的数组,也就是当前线程已经处理完所有负责的bucket if (i < 0 || i &g ...

  3. golang源码分析-启动过程概述

    golang源码分析-启动过程概述 golang语言作为根据CSP模型实现的一种强类型的语言,本文主要就是通过简单的实例来分析一下golang语言的启动流程,为深入了解与学习做铺垫. golang代码 ...

  4. v57.02 鸿蒙内核源码分析(编译过程) | 简单案例说透中间过程 | 百篇博客分析HarmonyOS源码

    子畏于匡,颜渊后.子曰:"吾以女为死矣."曰:"子在,回何敢死?" <论语>:先进篇 百篇博客系列篇.本篇为: v57.xx 鸿蒙内核源码分析(编译 ...

  5. HashMap与ConcurrentHashMap万字源码分析

    HashMap与ConcurrentHashMap`源码解析 JDK版本:1.7 & 1.8 ​ 开发中常见的数据结构有三种: 1.数组结构:存储区间连续.内存占用严重.空间复杂度大 优点:因 ...

  6. 鸿蒙系统源代码解析,鸿蒙内核源码分析(系统调用篇) | 图解系统调用全貌

    本篇说清楚系统调用 读本篇之前建议先读鸿蒙内核源码分析(总目录)工作模式篇. 本篇通过一张图和七段代码详细说明系统调用的整个过程,代码一捅到底,直到汇编层再也捅不下去. 先看图,这里的模式可以理解为空 ...

  7. ConcurrentHashMap的源码分析-transfer

    扩容是ConcurrentHashMap的精华之一,扩容操作的核心在于数据的转移,在单线程环境下数据的转移很简单,无非就是把旧数组中的数据迁移到新的数组.但是这在多线程环境下,在扩容的时候其他线程也可 ...

  8. [集合]ConcurrentHashMap的源码分析

    前言: 强推:一文读懂HashMap 这感觉讲的HashMap很明白. 1. 多线程环境下面,HashMap和Hashtable会怎么样? 1.1 HashMap 因为put会调用: // 新增Ent ...

  9. ConcurrentHashMap的源码分析-JDK1.7和Jdk1.8版本的变化

    ConcurrentHashMap和HashMap的实现原理是差不多的,但是因为ConcurrentHashMap需要支持并发操作,所以在实现上要比hashmap稍微复杂一些. 在JDK1.7的实现上 ...

最新文章

  1. 一份非常详尽的 Objective-C 到 Swift 的迁移指南
  2. Java中对比两个对象中属性值[反射、注解]
  3. Spring JDBC-混合框架的事务管理
  4. 【转】Cannot find -ltinfo when compiling android 4.0.3
  5. 深层学习:心智如何超越经验2.4 前景
  6. Nginx + php
  7. LPWA技术:发展物联网的最佳选择
  8. 老刘在微软Ignite China大会上聊低代码
  9. 前端学习(736):函数的返回值return
  10. 2018.10.20 NOIP模拟 蛋糕(线段树+贪心/lis)
  11. linux一级常用目录,小蚂蚁学习Linux(3)——Linux一级目录说明和常用命令解释...
  12. 右键计算机菜单,右键菜单设置方法步骤【图文】
  13. 时间复杂度-线性对数时间nlogn的一些研究
  14. 用 js 写的 WebSocketHeartBeat,心跳检测
  15. python写游戏的好选择: easygame
  16. 商业智能在医疗卫生领域的应用
  17. 解决 java 程序中 CPU 占用率过高问题
  18. PyInstaller来将python程序打包成exe程序及其图标自定义以及ico文件的简单制作
  19. 免费离线PDF工具箱,PDF工具大全,PDF合并PDF加密PDF解密PDF格式转换PDF分割PDF旋转以及从PDF中提取图片,满足对PDF操作的一切需求~完全免费无使用次数限制,文末附下载链接~
  20. 免费版软件文档文件格式转换

热门文章

  1. [SuperM]Shell编程课堂笔记+PPT总结
  2. C++中this指针的使用方法.
  3. usb5-写成usb驱动
  4. GDIDrawing3——GDI+绘图(三)
  5. 在一台服务器上配置多个Tomcat的方法
  6. Eclipse导入GitHub项目两处报错处理
  7. re:Invent 大会第一天,看看AWS有哪些最新进展?\n
  8. 对比let、const、var的异同
  9. #求教# 公共less模块中的背景图片地址应该怎么处理?
  10. git 本地分支与远程分支关联的一种方法