JDK1.7:首先将数据分一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一段数据时,其他段的数据也能被其他线程访问。ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment实现了ReentrantLock,所以Segment是一种可重入锁。HashEntry用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组。Segment的结构和HashMap类似,是一个数组和链表结构,一个Segment包含一个HashEntry数组,每个HashEntry是一个链表结构的元素,每个Segment守护着一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须先获取对应的Segment的锁。
JDK1.8:ConcurrentHashMap取消了Segment分段锁,采用CAS和synchronized来保证并发安全。数据结构跟HashMap1.8的结构类似,数组+链表/红黑树。JAVA8在链表长度超过一定阈值(8)时将链表转换为红黑树。synchronized只锁定当前链表或红墨树的首节点,这样只要hash不冲突,就不会产生并发,提升效率。
注意:本文归作者所有,未经作者允许,不得转载