请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师您好 ,我知道了hashmap的扩容机制,那请问下ConcurrentHashMap在jdk1.8是怎么扩容的

老师您好 ,我知道了hashmap的扩容机制,那请问下ConcurrentHashMap在jdk1.8是怎么扩容的
,谢谢老师

正在回答 回答被采纳积分+3

2回答

Jimin 2019-03-20 23:06:56

你好,在JDK8中彻底抛弃了JDK7的分段锁的机制,新的版本主要使用了Unsafe类的CAS自旋赋值+synchronized同步+LockSupport阻塞等手段实现的高效并发,代码可读性稍差。
ConcurrentHashMap的JDK8与JDK7版本的并发实现相比,最大的区别在于JDK8的锁粒度更细,理想情况下table数组元素的大小就是其支持并发的最大个数,在JDK7里面最大并发个数就是Segment的个数,默认值是16,可以通过构造函数改变一经创建不可更改,这个值就是并发的粒度,每一个segment下面管理一个table数组,加锁的时候其实锁住的是整个segment,这样设计的好处在于数组的扩容是不会影响其他的segment的,简化了并发设计,不足之处在于并发的粒度稍粗,所以在JDK8里面,去掉了分段锁,将锁的级别控制在了更细粒度的table元素级别,也就是说只需要锁住这个链表的head节点,并不会影响其他的table元素的读写,好处在于并发的粒度更细,影响更小,从而并发效率更好,但不足之处在于并发扩容的时候,由于操作的table都是同一个,不像JDK7中分段控制,所以这里需要等扩容完之后,所有的读写操作才能进行,因此扩容的效率也会差一些

1 回复 有任何疑惑可以回复我~
  • 提问者 慕神8359304 #1
    老师您好,谢谢老师的回答,学生是想请教老师JDK1.8的扩容机制,它是怎么扩容的,因为看代码有点看不懂
    回复 有任何疑惑可以回复我~ 2019-03-20 23:09:35
  • 齐Mger 回复 提问者 慕神8359304 #2
    你要习惯“答非所问”
    回复 有任何疑惑可以回复我~ 2019-07-06 19:11:13
该更新了 2019-07-05 12:39:41

关于看不懂如何扩容,你可以参考 码出高效那本书 ,讲的非常详细~绝对有你想要的,ps:还是全彩的

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信