ConCurrentHashMap常见面试题

  1. JDK1.7和JDK1.8中ConCurrentHashMap的实现有什么不同?

JDK1.7中的实现可以认为是大数组套小数组,大数组是Segment数组,小数组是HashEntry数组,锁是锁在大数组的元素上(Segment),力度比较大,原理如下

这是一种分段锁(或者叫做分片锁)的实现。

JDK1.8中

  1. 1.7和1.8中的ConCurrentHashMap怎么保证的线程安全?

1.7中通过给Segment加ReentrantLock锁来实现线程安全。

在线程安全方面,如果存储元素的计算结果为空,会使用CAS来设置该节点,如果不为空就会使用synchronized加锁来实现,遍历桶中的元素,替换或者新增元素到桶中,最后判断是否需要转为红黑树(链表长度大于8并且数组的长度大于64的时候,链表升级为红黑树的结构),整个过程相当于只对头结点进行了加锁,比Segment加锁力度更小,发生加锁和hash冲突的频率也更低了,并发场景下性能更高,因为使用了红黑树,数据量比较大的时候查询性能更好

关于1.8中的一些核心方法可以查看我的另一篇关于源码分析的文章ConCurrentHashMap源码分析_鱼跃鹰飞的博客-CSDN博客,1.7个人认为目前面试中一般作为对比使用,不会考具体的细节,毕竟很少有系统还在用1.7

相关推荐
未若君雅裁9 分钟前
JVM基础总结
java·jvm·java-ee
p***434813 分钟前
JavaScript数据分析实战
开发语言·javascript·ecmascript
星释14 分钟前
Rust 练习册 66:密码方块与文本加密
java·前端·rust
q***318920 分钟前
Spring Boot 实战篇(四):实现用户登录与注册功能
java·spring boot·后端
专注于大数据技术栈32 分钟前
java学习--==和equals
java·python·学习
鲸沉梦落36 分钟前
JVM类加载
java·jvm
carry杰37 分钟前
esayExcel导出图片
java·easyexcel 图片
蓝天智能41 分钟前
立体字型效果的Qt QSS实现
开发语言·qt
艾莉丝努力练剑41 分钟前
【C++:哈希表】从哈希冲突到负载因子:熟悉哈希表的核心机制
开发语言·c++·stl·散列表·哈希表·哈希·映射
路人甲ing..43 分钟前
Android Studio 快速的制作一个可以在 手机上跑的app
android·java·linux·智能手机·android studio