vlambda博客
学习文章列表

【源码分析篇】ConcurrentHashMap之原理

Java7

【源码分析篇】ConcurrentHashMap之原理
【源码分析篇】ConcurrentHashMap之原理

【源码分析篇】ConcurrentHashMap之原理
在Java7,ConcurrentHashMap(分段锁)对整个数据进行了分割分段(Segment),Segment是ReentrantLock重入锁。每把锁指锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高了并发访问率。Java8中已经摒弃了Segment的概念,而是直接用node 数据+链表+红黑树的数据结构来实现,并发控制使用synchronized和CAS来操作。
#

Java8
【源码分析篇】ConcurrentHashMap之原理

Java8中的实现:

1. 先拿到根据rehash值定位,拿到table[i]的首节点first

2. 判断key和value是否存在null值,存在直接抛NPE。

· 若数组为空,初始化数组

· 若链表为空,初始化一个链表节点

· 若当前节点的hashCode=-1,表示当前正在扩容,去帮助扩容

· 否则,若没有获取锁,阻塞,获取到锁,进行后续操作

· 若为key存在,直接覆盖,否则新增

· 若为树形,则进行树形的添加操作

· 判断是否满足树化的条件