专栏首页人生得意须尽欢ConcurrentHashMap 类实际应用处理
原创

ConcurrentHashMap 类实际应用处理

public class ConcurrentHashMap<K, V> extends AbstractMap<K, V> implements ConcurrentMap<K, V>, Serializable { 
 
   /** 
    * 散列表的默认初始容量为 16,即初始默认为 16 段
    */ 
   static final int DEFAULT_INITIAL_CAPACITY= 16; 
   static final float DEFAULT_LOAD_FACTOR= 0.75f; 
 
   /** 
    * 散列表的默认并发级别为 16。该值表示当前更新线程的估计数,在构造函数中没有指定这个参数时,使用本参数
    */ 
   static final int DEFAULT_CONCURRENCY_LEVEL= 16; 
 
   /** 
    * segments 的掩码值
    * key 的散列码的高位用来选择具体的 segment 
    */ 
   final int segmentMask; 
 
   /** 
    * 偏移量
    */ 
   final int segmentShift; 
 
   /** 
    * 由 Segment 对象组成的数组
    */ 
   final Segment<K,V>[] segments; 
 
   /** 
    * 创建一个带有指定初始容量、负载因子和并发级别的新的空散列表
    */ 
   public ConcurrentHashMap(int initialCapacity,  float loadFactor, int concurrencyLevel) { 
       if(!(loadFactor > 0) || initialCapacity < 0 || concurrencyLevel <= 0) 
           throw new IllegalArgumentException(); 
 
       if(concurrencyLevel > MAX_SEGMENTS) 
           concurrencyLevel = MAX_SEGMENTS; 
 
       // 寻找最佳匹配参数(不小于给定参数的最接近的 2 次幂) 
       int sshift = 0; 
       int ssize = 1; 
       while(ssize < concurrencyLevel) { 
           ++sshift; 
           ssize <<= 1; 
       } 
       segmentShift = 32 - sshift;       // 偏移量值
       segmentMask = ssize - 1;           // 掩码值 
       this.segments = Segment.newArray(ssize);   // 创建数组
 
       if (initialCapacity > MAXIMUM_CAPACITY) 
           initialCapacity = MAXIMUM_CAPACITY; 
       int c = initialCapacity / ssize; 
       if(c * ssize < initialCapacity) 
           ++c; 
       int cap = 1; 
       while(cap < c) 
           cap <<= 1; 
 
       // 依次遍历每个数组元素
       for(int i = 0; i < this.segments.length; ++i) 
           // 初始化每个数组元素引用的 Segment 对象
          this.segments[i] = new Segment<K,V>(cap, loadFactor); 
   } 
 
   /** 
    * 创建一个带有默认初始容量 (16)、默认加载因子 (0.75) 和 默认并发级别 (16) 的空散列表。
    */ 
   public ConcurrentHashMap() { 
       this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR, DEFAULT_CONCURRENCY_LEVEL); 
}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 邮件RPA流程自动化处理的原理及实际应用

    自打企业级电子邮件系统被引入企业事务处理流程之后,从内部的上级指示、下属报告和请示、同级工作流程处理,到外部客户的业务处理请求和批示、各个业务系统自动生成的业务...

    蕉黄
  • sentinel的实际应用

    上一章中我们通过Dashboard来为Sentinel客户端设置各种各样的规则,但是这些规则默认是存放在内存中,极不稳定,无法用于生成环境,所以需要将其持久化。

    Java旅途
  • 【DEVOPS】Devops实际应用

    (1)哪些企业不需要考虑Devops?企业只有价值流的一部分参与进来;企业不认可IT是关键的业务;

    心跳包
  • setbit的实际应用

    程序员小饭
  • Nginx的实际应用

    https://download.csdn.net/download/learning_lb/9921929

    Learning_斌
  • zuul源码分析-探究原生zuul的工作原理

    最近在项目中使用了SpringCloud,基于Zuul搭建了一个提供加解密、鉴权等功能的网关服务。鉴于之前没怎么使用过Zuul,于是顺便仔细阅读了它的源码。实际...

    Throwable
  • 理解Java8并发工具类ConcurrentHashMap的实现

    前面的文章已经分析过List和Queue相关的接口与并发实现类,本篇我们来分析一下非常Java里面非常重要的一个数据结构HashMap。(注意Set类型在这里我...

    我是攻城师
  • 多线程设计模式 : Master-Worker模式

    Master-Worker是常用的并行计算模式。它的核心思想是系统由两类进程协作工作:Master进程和Worker进程。Master负责接收和分配任务,Wor...

    JAVA日知录
  • react-hooks 的实际应用

    2019年2月,随着react16.8版本的发布,react带来了稳定版的hooks,我从2019年的10月份开始使用hook,现在使用了大半年了,记录下遇到的...

    windseek
  • Matrix-ApkChecker的实际应用

    每当我想下载一个新App,在应用商店点击下载却看到“空间不足”的提醒时,我的内心是崩溃的。

    雷子
  • redis实际应用-限流

    旅游景点通常都会有最大的接待量,不可能无限制的放游客进入,比如故宫每天只卖八万张票,超过八万的游客,无法买票进入,因为如果超过八万人,景点的工作人员可能就忙不过...

    程序员小饭
  • 聊聊java中的哪些Map:(六)ConcurrentHashMap源码分析

    在聊完HashTable和HashMap的区别之后,自然该到了聊聊ConcurrentHashMap的时间了。HashTable逐渐被废弃,就是因为Concur...

    冬天里的懒猫
  • 3秒搞定ConcurrentHashMap

    1、ConcurrentHashMap,是Java并发包中自JDK1.5后提供的一个线程安全且高效的HashMap实现,可以用来替代HashTable。直接实现...

    老兵程序员
  • ConcurrentHashMap使用示例

    作者:mononite 链接:https://my.oschina.net/mononite/blog/144329(点击文末阅读原文前往) Concurren...

    java达人
  • 深入浅出ConcurrentHashMap内部实现

    ConcurrentHashMap可以说是目前使用最多的并发数据结构之一,作为如此核心的基本组件,不仅仅要满足我们功能的需求,更要满足性能的需求。而实现一个高性...

    敖丙
  • Zuul详解

      微服务具有系统小(一个程序员可以独立完成开发),可以独立部署,能快速进行迭代等优点。因为系统切分的小,必然也就意味着会有更多的系统需要进行维护。在实际应用中...

    良辰美景TT
  • 区块链有何实际用处?

    提到区块链,大多数人脑海里马上浮现的是各种币:比特币、以太币、各种稳定币、各种ICO。很多人觉得,在牛市拿它玩一把发个小财,如今熊市漫漫,留它何用?

    广州闪链科技
  • 每天都在用 Map,这些核心技术你知道吗?

    本篇文章站在多线程并发安全角度,带你了解多线程并发使用 HashMap 将会引发的问题,深入学习 ConcurrentHashMap ,带你彻底掌握这些核心技术...

    andyxh
  • Apache Dubbo实际应用总结

    一方面是SpringCoud微服务框架如火如荼的发展,另一方面随着Dubbo的重启,接着又捐献给Apache社区,Dubbo在国内技术市场上又重新攻城略地,随着...

    MavenTalker

扫码关注云+社区

领取腾讯云代金券