1.JDK1.7
在JDK1.7中ConcurrentHashMap采用分段锁实现线程安全。将数据分为一段一段存储,给每段数据分配一个锁,当一个线程占用锁访问其中一段数据时,其他段的数据也能被访问。
ConcurrentHashMap由分段锁Segment数组和节点HashEntry数组组成。分段锁Segment实现了ReentranLock,因此Segment是可重入锁。
一个ConcurrentHashMap包含一个Segment数组,一个Segment包含一个节点HashEntry数组。当对HashEntry元素进行修改时,必须先获得对应的Segment的分段锁。
Segment静态内部类继承ReentrantLock。
2.JDK1.8
在JDK1.8中,ConcurrentHashMap采用CAS和synchronized实现线程安全。synchrinized只锁定当前链表或者红黑树的首节点,只要不发生hash冲突,就不会产生并发,效率大大提高。