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冲突,就不会产生并发,效率大大提高。

JDK1.7的ConcurrentHashMap使用分段锁Segment来保证线程安全,每个Segment是一个ReentrantLock。而在JDK1.8中,采用了CAS和synchronized,仅锁定链表或红黑树的首节点,提高了并发性能。
2173

被折叠的 条评论
为什么被折叠?



