1.8 ConcurrentHashMap为何放弃分段代码锁

2020-05-29  本文已影响0人  星空怎样

[toc]

JDK1.7分段代码锁的实现

和HashMap一样在1.7中ConcurrentHashMap的底层数据结构是数组加链表,和HashMap不同的是ConcurrentHashMap存放的数据是一段一段的,即由多个Segment组成,每个Segment都有类似的数组加链表的结构。
关于Segment:

ConturrentHashMap有三个参数:

其中concurrentLevel控制了Segment的个数,在一个ConcurrentHashMap创建后Sement的个数是不能变的,扩容过程改变的是每个Segement的大小。

Segement继承了重入锁ReentrantLock,有锁的功能,每个锁控制的是一段,当每个Segement越来越大时,锁的力度就变的很大。

JDK1.8的ConcurrentHashMap实现

和hashMap一样采用了数组链表红黑树的形式数组进行扩容,链表可以转化为红黑树。

什么时候扩容?

什么时候链表转为红黑树?

当数组大小超过64并且链表中元素个数超过默认8的时候链表转为红黑树,但链表长度小于等于6时候会将红黑树转为链表(红黑树保留链表特性)。

1.8的线程安全的实现

1.8的代码把数组中每个元素看成一个桶,可以看到大部分的CAS操作,加锁部分是对桶的头结点进行加锁粒度很小。

为什么弃用Segement而用Synchroniized

上一篇 下一篇

猜你喜欢

热点阅读