老师您好 ,我知道了hashmap的扩容机制,那请问下ConcurrentHashMap在jdk1.8是怎么扩容的
来源:6-2 J.U.C之AQS-CountDownLatch
![](http://img1.sycdn.imooc.com/user/5b8ce3ce0001ebc402000200-100-100.jpg)
慕神8359304
2019-03-20
老师您好 ,我知道了hashmap的扩容机制,那请问下ConcurrentHashMap在jdk1.8是怎么扩容的
,谢谢老师
2回答
-
Jimin
2019-03-20
你好,在JDK8中彻底抛弃了JDK7的分段锁的机制,新的版本主要使用了Unsafe类的CAS自旋赋值+synchronized同步+LockSupport阻塞等手段实现的高效并发,代码可读性稍差。
ConcurrentHashMap的JDK8与JDK7版本的并发实现相比,最大的区别在于JDK8的锁粒度更细,理想情况下table数组元素的大小就是其支持并发的最大个数,在JDK7里面最大并发个数就是Segment的个数,默认值是16,可以通过构造函数改变一经创建不可更改,这个值就是并发的粒度,每一个segment下面管理一个table数组,加锁的时候其实锁住的是整个segment,这样设计的好处在于数组的扩容是不会影响其他的segment的,简化了并发设计,不足之处在于并发的粒度稍粗,所以在JDK8里面,去掉了分段锁,将锁的级别控制在了更细粒度的table元素级别,也就是说只需要锁住这个链表的head节点,并不会影响其他的table元素的读写,好处在于并发的粒度更细,影响更小,从而并发效率更好,但不足之处在于并发扩容的时候,由于操作的table都是同一个,不像JDK7中分段控制,所以这里需要等扩容完之后,所有的读写操作才能进行,因此扩容的效率也会差一些122019-07-06 -
该更新了
2019-07-05
关于看不懂如何扩容,你可以参考 码出高效那本书 ,讲的非常详细~绝对有你想要的,ps:还是全彩的
00
相似问题