A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小江哥 于 2018-1-8 11:41 编辑

一. 写在前面
    对于我们程序员来说,集合类在开发中是非常常用的,但是对于一般的集合比如hashmap来说他是线程不安全的,在高并发的条件下hashmap会出现各种各样的问题,那我们采用什么方法来解决这样的问题呢,有的人可能会说采用同步代码块加锁,但是这样对整个操作集合的操作加锁无疑效率低下所以java中给我们提供了一个concurrentHashMap类来解决这样的问题:

二. ConcurrentHashMap的结构
    我们都知道对于HashMap来说是通过数组加链表的方式来解决hash冲突,同样的对于ConcurrentHashMap来说也是如此,不过HashMap底层是Entry数组,而ConcurrentHashmap底层是segment数组,segemnet数组的每个元素存放的是HashEntry数组,ConcurrentHashMap通过segment数组来实现分段式锁,通过HashEntry数组来实现key-value的存储,结构如下图:
对于ConcurrentHashMap来说底层对每个segment元素进行了加锁操效率更高
三: 常用成员变量
//初始的容量
  static final intDEFAULT_INITIAL_CAPACITY = 16;
//初始的加载因子
static final floatDEFAULT_LOAD_FACTOR = 0.75f;
//初始的并发等级
static final intDEFAULT_CONCURRENCY_LEVEL = 16;
//最大容量
static final intMAXIMUM_CAPACITY = 1 << 30;
//最小的segment数量
static final intMIN_SEGMENT_TABLE_CAPACITY = 2;
//最大的segment数量
static final int MAX_SEGMENTS = 1 << 16;
//segment数组
final Segment<K,V>[] segments;

四: 构造方法
一般来说我们创建concurrenthashmap对象使用的是无参的构造
查看原码发现原码中使用this调用了本类三个参数的构造下面是三个参数构造的代码:

五: put方法
segment对象的put方法的分析

六:扩容rehash方法



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马