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

相关推荐
叶帆2 分钟前
【YFIOs】用C#开发硬件之WiFi网络
开发语言·网络·c#
meilindehuzi_a5 分钟前
深入理解 JavaScript 的同步与异步机制:从单线程设计到 Promise 核心应用
开发语言·javascript·ecmascript
小刘|9 分钟前
Spring WebFlux + AI 流式输出深度解析:Spring AI 与 LangChain4j 效果差异溯源
java·后端·spring
Arvin.Angela14 分钟前
Maven 的基本配置操作
java·maven
夕除16 分钟前
Spring Security 配置类(SecurityConfig)
java·后端·spring
weixin1997010801618 分钟前
[特殊字符] 1688开放平台API Sign签名算法详解(Java / Python / PHP 实现)
java·python·算法
武子康23 分钟前
Java-22 深入浅出 MyBatis - 手写ORM框架3 手写SqlSession、Executor 工作原理
java·后端
未若君雅裁30 分钟前
JVM 垃圾回收算法与分代回收机制
java·jvm·算法
智者知已应修善业36 分钟前
【51单片机初始化D5-D8亮,每按键按下D1到D4全亮,再按下恢复,如此循环】2024-3-26
c++·经验分享·笔记·算法·51单片机