当前位置: 首页 > news >正文

ConcurrentHashMap线程安全机制解析【个人八股】

ConcurrentHashMap 怎么保证线程安全【重】需要明确的是ConcurrentHashMap是hashmap的线程安全版本以及对应的读写操作都是怎么进行实现的ConcurrentHashMap 是 HashMap 的线程安全版本。JDK 7 采用的是分段锁整个 Map 会被分为若干段每个段都可以独立加锁。不同的线程可以同时操作不同的段从而实现并发。JDK 8 使用了一种更加细粒度的锁——桶锁再配合 CAS synchronized 代码块控制并发写入以最大程度减少锁的竞争。对于读操作ConcurrentHashMap 使用了 volatile 变量来保证内存可见性。对于写操作ConcurrentHashMap 优先使用 CAS 尝试插入如果成功就直接返回否则使用 synchronized 代码块进行加锁处理。说一下 JDK 7 中 ConcurrentHashMap 的实现原理JDK 7 的 ConcurrentHashMap 采用的是分段锁整个 Map 会被分为若干段每个段都可以独立加锁每个段类似一个 Hashtable。每个段维护一个键值对数组HashEntryK, V[] tableHashEntry 是一个单项链表。段继承了 ReentrantLock所以每个段都是一个可重入锁不同的线程可以同时操作不同的段从而实现并发。说一下 JDK 7 中 ConcurrentHashMap 的 put 流程put 流程和 HashMap 非常类似只不过是先定位到具体的段再通过 ReentrantLock 去操作而已。一共可以分为 4 个步骤第一步计算 key 的 hash定位到段段如果是空就先初始化第二步使用 ReentrantLock 进行加锁如果加锁失败就自旋自旋超过次数就阻塞保证一定能获取到锁第三步遍历段中的键值对 HashEntrykey 相同直接替换key 不存在就插入。第四步释放锁。说一下 JDK 7 中 ConcurrentHashMap 的 get 流程get 就更简单了先计算 key 的 hash 找到段再遍历段中的键值对找到就直接返回 value。get 不用加锁因为是 value 是 volatile 的所以线程读取 value 时不会出现可见性问题。说一下 JDK 8 中 ConcurrentHashMap 的实现原理JDK 8 中的 ConcurrentHashMap 取消了分段锁采用 CAS synchronized 来实现更细粒度的桶锁并且使用红黑树来优化链表以提高哈希冲突时的查询效率性能比 JDK 7 有了很大的提升。说一下 JDK 8 中 ConcurrentHashMap 的 put 流程第一步计算 key 的 hash以确定桶在数组中的位置。如果数组为空采用 CAS 的方式初始化以确保只有一个线程在初始化数组。第二步如果桶为空直接 CAS 插入节点。如果 CAS 操作失败会退化为 synchronized 代码块来插入节点。插入的过程中会判断桶的哈希是否小于 0f.hash 0小于 0 说明是红黑树大于等于 0 说明是链表。第三步如果链表长度超过 8转换为红黑树。第四步在插入新节点后会调用addCount()方法检查是否需要扩容。说一下 JDK 8 中 ConcurrentHashMap 的 get 流程get 也是通过 key 的 hash 进行定位如果该位置节点的哈希匹配且键相等则直接返回值。如果节点的哈希为负数说明是个特殊节点比如说如树节点或者正在迁移的节点就调用find方法查找。否则遍历链表查找匹配的键。如果都没找到返回 null。说一下 HashMap 和 ConcurrentHashMap 的区别HashMap 是非线程安全的多线程环境下应该使用 ConcurrentHashMap。
http://www.gsyq.cn/news/1383369.html

相关文章:

  • 上海搬家公司决策:2026上半年市场格局与预算分档参考 - 资讯快报
  • 泰州黄金回收优选榜单|特色门店甄选 合规经营无套路 本地行业标杆 - 鑫顺黄金回收
  • 避开下载坑!实测GLC_FCS30三大官方下载渠道,哪个最适合你?(附速度对比与技巧)
  • 2026 北京优质金蝶软件代理商推荐 - GrowthUME
  • 如何用Umi-OCR三步掌握高效离线文字识别
  • 【checkBox】
  • Awoo Installer:Nintendo Switch游戏安装的终极免费解决方案
  • 租用4090服务器CUDA与PyTorch极速部署实操指南
  • 中山南岸声学:23 年口碑沉淀 四大维度铸就汽车音响改装行业传奇 - 汽车音响改装
  • 基于RS485与Elektor总线的AVR Bootloader设计与实现
  • 基于ESP32与MQTT的物联网信息板:打通数字与物理世界的智能消息中枢
  • 基于ubuntu20.04和taotoken构建高可用ai服务网关的实践
  • 2026年,专业做GEO优化的公司有何独特之处,带你一探究竟! - GrowthUME
  • PDF差异对比终极指南:用diff-pdf告别文档核对烦恼
  • DeepSeek代码风格检查避坑指南(内部审计报告首次披露:37个被忽略的合规红线)
  • 网飞成立 AI 动画工作室,开启流媒体“原生 AI 制片时代”,中外布局逻辑有何不同?
  • Keil µVision反汇编窗口内容导出方案与调试技巧
  • 番茄小说下载器完整指南:5步实现免费离线阅读与永久保存
  • 如何下载Qobuz无损音乐:qobuz-dl工具完全指南
  • 中小团队如何借助 Taotoken 统一管理分散的 AI API 调用与成本
  • 测试环境治理:从“能用就行”到“生产级”的进化之路
  • 应对Claude Code访问不稳定,快速切换至Taotoken的应急方案
  • 告别杂乱!用FileMenu Tools 8.4.2一键清理Windows 11右键菜单(附隐藏技巧)
  • PyCorrector实战踩坑:从‘穿流不息’纠成‘传流不息’,聊聊中文纠错模型的局限性怎么破
  • 数字孪生:现实世界的镜像
  • 从股票预测到智能聊天:用TensorFlow/Keras实战LSTM,搞定时间序列分析与文本生成
  • IT证书含金量封神榜:2026年值得写进简历的硬核凭证(附避坑指南)
  • 将本地代码放在Github上进行管理
  • 从零实现软件定义以太网:自制网络健康检测仪全解析
  • 劳力士售后焕新季|2026 年 5 月新网点启用 服务效率与标准双提升 - 资讯快报