黑马程序员技术交流社区

标题: 【黑马程序员杭州】原码分析---ConcurrentHashMap原码 [打印本页]

作者: 小江哥    时间: 2018-1-8 11:18
标题: 【黑马程序员杭州】原码分析---ConcurrentHashMap原码
本帖最后由 小江哥 于 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方法








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2