大家都知道java中有很多的基础知识,需要大家花费一定的时间去消化。关于java中ConcurrentHashMap

的扩容机制不知道大家是否了解过,其实内容也是很好理解的,一起来看看吧。

首先,我们需要知道的是:

1. 计算每个线程可以处理的桶区间。默认 16.

2. 初始化临时变量nextTable,扩容 2 倍。

3. 死循环,计算下标。完成总体判断。

4. 如果桶内有数据,同步转移数据。通常会像链表拆成2份。

然后来看一下,java中ConcurrentHashMap的扩容机制是怎样的?

它的大体思想就是遍历、复制的过程。首先根据运算得到需要遍历的次数i,然后利用tabAt方法获得i位置的元素:

如果这个位置为空,就在原table中的i位置放入forwardNode节点,这个也是触发并发扩容的关键点;

如果这个位置是Node节点(fh>=0),如果它是一个链表的头节点,就构造一个反序链表,把他们分别放在nextTable的i和i+n的位置上

如果这个位置是TreeBin节点(fh<0),也做一个反序处理,并且判断是否需要untreefi,把处理的结果分别放在nextTable的i和i+n的位置上

遍历过所有的节点以后就完成了复制工作,这时让nextTable作为新的table,并且更新sizeCtl为新容量的0.75倍 ,完成扩容。

最后说一下,多线程是如何完成的:

如果遍历到的节点是forward节点,就向后继续遍历,再加上给节点上锁的机制,就完成了多线程的控制。多线程遍历节点,处理了一个节点,就把对应点的值set为forward,另一个线程看到forward,就向后遍历。这样交叉就完成了复制工作。

上述的内容是不是很好理解呢?其实java中像这样的基础知识还是有很多的,具体的就需要大家自己去了解和学习了。想要了解更多java基础知识,敬请关注奇Q工具网。

推荐阅读:

java map扩容机制_java中ConcurrentHashMap的扩容机制是怎样的?详细解析相关推荐

  1. java map扩容机制_java中ConcurrentHashMap的扩容机制问题

    JDK8中,扩容函数transfer中有如下一段代码,如果槽内的结点为链表结点,把原链表的结点按照某位的元素是否为1,划分为两个链表,分别放置在nextTab[i]和nextTab[n+i]位置上, ...

  2. java map 允许重复_java中key值可以重复的map:IdentityHashMap

    在Java中,有一种key值可以重复的map,就是IdentityHashMap.在IdentityHashMap中,判断两个键值k1和 k2相等的条件是 k1 == k2 .在正常的Map 实现(如 ...

  3. java gc回收机制_Java中的GC回收机制

    为什么要进行GC回收? 当我们新建一个对象时,系统就会为其分配一定的内存空间,而有时候新建的对象没有去使用时,不回收的话会极大浪费内存空间,造成系统效率低下. 什么时候进行GC回收? 1.当CPU空闲 ...

  4. java map 自动排序_Java中Map的排序

    Map的种类 在Java中,Map的主要作用是存储键值对.由于是根据键得到值,所以不允许键重复.它主要有如下几个类别: HashMap: 最常用的Map,它根据键的HashCode值存储数据,根据键可 ...

  5. java map集合使用_JAVA中Map集合的使用举例

    首先创建一个Emp类,再将几个Emp对象添加到Map集合中. Emp的id作为Map的键,并将id为"005"的对象从集合中删除. package com.han; import ...

  6. java map 为空_java中如何判断map是否为空

    java中判断map是否为空的方法是:可以利用isEmpty()函数来判断.isEmpty()函数是java中用于判断某种容器是否有元素的系统库函数,例如用来判断ArrayList.HashSet.H ...

  7. java final内存机制_Java中的内存处理机制和final、static、final static总结

    装载自:http://blog.csdn.net/wqthaha/article/details/20923579 Java程序运行在JVM上,可以把JVM理解成Java程序和操作系统之间的桥梁,JV ...

  8. java map传入参数_JAVA中map中参数的添加修改

    Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象. Map的接口 Map---实现Map Map.Entry--Map的内部类,描述Map中的按键/数值对. S ...

  9. java map初始化方式_java中Map和List初始化的两种方法

    第一种方法(常用方法): //初始化List List list = new ArrayList(); list.add("string1"); list.add("st ...

最新文章

  1. boost::intrusive::circular_list_algorithms用法的测试程序
  2. 个推异常值检测和实战应用
  3. 第二十八期:Notepad++ 新 Logo 出炉,官网全新改版采用自适应设计
  4. EXE.DLL文件图标导出器[免费下载]
  5. 05NumPy--5.4随机数
  6. 支付宝基金收益灰色是什么意思?
  7. java字面量和符号引用_JVM中的直接引用和符号引用
  8. 力扣-48 旋转图像
  9. 7-49 打印学生选课清单 (25 分)
  10. 图解PCIE原理(从软件角度)
  11. 翼支付门户架构之搭建SpringMvc环境
  12. 看到了便有增加福慧机会的好文
  13. 有关Word创建英语练字模板的宏
  14. element日期选择器 年月日选择
  15. 使用线程模拟倒计时和打印当前系统时间
  16. 王道考研计算机网络笔记,王道考研-操作系统整理笔记.pdf
  17. 手把手教你用fairseq训练一个NMT机器翻译系统
  18. 美团点评携手巴黎欧莱雅沙龙专属发起“城市新青年”计划
  19. 同济大学计算机网络期末考试题,完整word版,同济大学计算机网络考试题及答案,推荐文档...
  20. 搜索引擎:Frame of Reference 和 Roaring Bitmaps

热门文章

  1. R学习之——R用于文本挖掘(tm包)
  2. CISCO PIX防火墙的配置
  3. 全球最囧的爱情测试.....
  4. springboot集成环信sdk报错
  5. jackson/fastJson boolean类型问题
  6. 数据结构与算法--6.二分查找
  7. 域添加另一台机器_巨杉Tech | SequoiaDB数据域概念解读与实践
  8. 面试之 Redis汇总
  9. Django初次体验
  10. pymysql操作mysql数据库