Java面试问答宝典(ConcurrentHashMap篇)-Segment如何扩容?

我们参加Java培训学习都是希望能够毕业后找到满意的工作,然而培训机构只是推荐就业,我们仍然需要进行面试,提高面试技术问答的正确率有助于增加面试官的满意度。本系列全面汇总了企业Java面试的技术问题,希望能够帮助大家。

本文列举的技术问题有:

更多Java面试技术问答后续会继续提供,想要一口气获得所有答案的小伙伴可以评论交流哦~

问题一:Segment如何实现扩容?

A:

ConcurrentHashMap 的扩容是仅仅和每个Segment元素中HashEntry数组的长度有关,但需要扩容时,只扩容当前Segment中HashEntry数组即可。也就是说ConcurrentHashMap中Segment[]数组的长度是在初始化的时候就确定了,后面扩容不会改变这个长度。

问题二:1.8版本的数据结构是什么样的?

A:

1.8版本放弃了Segment,跟HashMap一样,用Node描述插入集合中的元素。但是Node中的val和next使用了volatile来修饰,保存了内存可用性。与HashMap相同的是,ConcurrentHashMap1.8版本使用了数组+链表+红黑树的结构。

同时,ConcurrentHashMap使用了CAS+Synchronized保证了并发的安全性。下面介绍ConcurrentHashMap的put过程:

问题三:ConcurrentHashMap效率为什么高?

A:

因为ConcurrentHashMap的get方法并没有上锁。get时通过hash(key)定位到Segment上,再通过一次Hash定位到具体的HashEntry上。HashEntry的get方法如下:

由于HashEntry的value属性使用了volatile修饰,保证了内存可用性,每次获取都是最新值。因此整个过程不需要加锁。

展开阅读全文

页面更新:2024-06-06

标签:问答   可用性   数据结构   数组   长度   宝典   元素   效率   内存   版本   技术

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top