本帖最后由 小江哥 于 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方法
|