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

相关推荐
霸道流氓气质6 分钟前
Saga模式入门与实战:编排与协同模式、补偿设计原则与Java生产级实现
java·开发语言
荆棘鸟智能7 分钟前
虫情测报灯图像识别算法实践:小目标检测、粘连计数与飞虱细粒度分类
算法·目标检测·分类
江湖有缘12 分钟前
Docker实战 | 使用Docker部署Readeck书签管理工具
java·docker·eureka
小毛驴85015 分钟前
mvn help:effective-settings 与 mvn help:effective-pom
java·linux·前端
silvamux_28 分钟前
OpenAI Python SDK v1 迁移实战
开发语言·python
silvamux_28 分钟前
MiniMax API 调用教程:兼容 OpenAI 写法
java·数据库·elasticsearch
爱读书的小胖29 分钟前
LeetCode 27. 移除元素(C)解题分析
数据结构·算法
旋生万物29 分钟前
螺旋数不是玄学:Python 实现广义复数与等角螺线
开发语言·人工智能·python·云原生·aigc·软件工程·后端开发
半杯咖啡半行码30 分钟前
Linux字符设备驱动实战:ioctl接口与GPIO操作指南
linux·开发语言
科技小E30 分钟前
敏感数据不敢上云训练?本地大模型推理服务器DLTM私有化部署,让训练全程留在企业内网
大数据·算法·自动化