其key 不为空
桶上链表长度达到 8 个或者以上,并且数组长度为 64 以下时只会触发扩容而不会将链表转为红黑树
CurrentHashMap(jdk1.8) 之所以线程安全 因为 在添加元素时候,采用synchronized来保证线程安全,然后计算size的时候采用CAS操作进行计算,采用volatile 修饰 HashEntry[] table保存数据(Node 数组),采用table数组元素作为锁 细化锁粒度
CurrentHashMap(jdk1.7)(Entry 数组)之所以线程安全 因为 分段锁 Segment
JDK1.7版本的CurrentHashMap的实现原理
在JDK1.7中ConcurrentHashMap采用了数组+Segment+分段锁的方式实现。
Segment(分段锁)-减少锁的粒度
ConcurrentHashMap中的分段锁称为Segment,它即类似于HashMap的结构,即内部拥有一个Entry数组,数组中的每个元素又是一个链表,同时又是一个ReentrantLock(Segment继承了ReentrantLock)。
内部结构
ConcurrentHashMap使用分段锁技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问,能够实现真正的并发访问。如下图是ConcurrentHashMap的内部结构图: