最爱问的高频ConcurrentHashMap原理,你会了吗?

简介: ConcurrentHashMap 是 Java 中的线程安全散列表实现,允许多个线程同时访问和修改数据。它在 JDK 1.7 中通过分段锁机制将 HashMap 分为多个段,每个段使用独立的锁来保证线程安全;而在 JDK 1.8 中则采用 CAS 和 synchronized 结合的方式,提高了并发性能。与 HashMap 相比,ConcurrentHashMap 是线程安全的,支持更高的并发性能,且不支持 null 键和值。CAS(Compare-and-Swap)是一种无锁原子操作,用于确保多线程环境下的数据一致性,避免竞态条件。

1、ConcurrentHashMap 是什么?它的工作原理是什么?

ConcurrentHashMap 是Java中的一个线程安全的散列表实现。与HashMap不同,ConcurrentHashMap支持多个线程同时访问和修改散列表,而不需要任何额外的同步机制。

ConcurrentHashMap 的工作原理与 HashMap 类似,同样jdk1.8前后区别较大:


添加图片注释,不超过 140 字(可选)


JDK1.7 中的 ConcurrentHashMap 使用分段锁机制来实现线程安全。分段锁机制将 HashMap 分为多个段,每个段使用一个锁来保护。这样,当多个线程同时访问同一个段时,只会有一个线程能够获取锁,从而保证了线程安全。

JDK1.8 中的 ConcurrentHashMap 使用 CAS 和 synchronized 两种机制来实现线程安全。CAS是Compare and Swap 的缩写,它是一种无锁原子操作。synchronized 是 Java 中的关键字,可以保证线程安全。

2、ConcurrentHashMap 与 HashMap 的区别是什么?

ConcurrentHashMap 和 HashMap 都是散列表实现,但它们之间有一些关键的区别。主要区别如下:

  • 线程安全:ConcurrentHashMap 是线程安全的,而 HashMap 不是。
  • 性能:在高并发的情况下,ConcurrentHashMap 的性能通常比 HashMap 更好,因为它允许多个线程同时访问散列表,而无需进行额外的同步。
  • null 键和 null 值:ConcurrentHashMap 不支持 null 键和 null 值,而 HashMap 支持。


3、ConcurrentHashMap 中的分段锁是什么?它如何确保线程安全?

JDK1.7 中的分段锁机制

JDK1.7 中的 ConcurrentHashMap 将 HashMap 分为多个段,每个段使用一个锁来保护。这样,当多个线程同时访问同一个段时,只会有一个线程能够获取锁,从而保证了线程安全。

JDK1.7 中 ConcurrentHashMap 分段锁机制的具体实现如下:

  • ConcurrentHashMap 使用一个 Segment[] 数组来存储各个段。


添加图片注释,不超过 140 字(可选)


  • 每个 Segment 都实现了 ReentrantLock 接口,可以用于获取锁。


添加图片注释,不超过 140 字(可选)



添加图片注释,不超过 140 字(可选)


  • 当一个线程访问 ConcurrentHashMap 时,会先根据键的哈希值计算出段索引。然后,线程会尝试获取该段的锁。如果获取成功,则线程可以安全地访问该段中的键值对。

JDK1.8 中的 CAS + synchronized 机制

JDK1.8 中的 ConcurrentHashMap 使用 CAS 和 synchronized 两种机制来实现线程安全。


添加图片注释,不超过 140 字(可选)


CAS 是 Compare and Swap 的缩写,它是一种无锁原子操作。


添加图片注释,不超过 140 字(可选)


synchronized 是 Java 中的关键字,可以保证线程安全。


添加图片注释,不超过 140 字(可选)


JDK1.8 中 ConcurrentHashMap 使用 CAS 来更新键值对。当一个线程尝试更新键值对时,会先使用 CAS 来更新内存中的值。如果更新成功,则线程成功更新了键值对。如果更新失败,则说明另一个线程已经更新了该键值对,此时线程会重新尝试更新。

JDK1.8 中 ConcurrentHashMap 使用 synchronized 来访问链表。当一个线程需要访问链表时,会先获取链表的锁。如果获取成功,则线程可以安全地访问链表。

4、什么是CAS?

多线程中的CAS(Compare-and-Swap)操作是一种常见的并发控制方法,用于实现原子性更新共享变量的值。其核心思想是通过比较内存地址上的值和期望值是否相等来确定是否可以进行更新操作,从而避免多线程条件下的竞态问题。它是一种CPU指令级的操作,保证数据一致性。包含三个值,内存地址(V),预期值(A),新值(B)。A B线程更新变量值,A B线程先获取变量值,然后生成新值,变量值放在内存V中、预期原值为A(备份值)、新值为B。如果V=A 更新新值。在多线程情况下保证值的一致性。主要是保证线程当时取的值,在要更新的时候内存还是那个值没有被其它线程改变了。

添加图片注释,不超过 140 字(可选)

具体来说,多线程CAS操作包括以下几个步骤:

  1. 获取当前共享变量的值和期望值。
  2. 比较共享变量的当前值和期望值是否相等,如果相等则将共享变量的值更新为要写入的新值。
  3. 如果共享变量的当前值与期望值不相等,则说明此时有其他线程已经修改了共享变量的值,那么当前线程需要重新获取共享变量的最新值,并重复执行步骤2。

在并发环境下,多线程CAS操作可以保证共享变量的原子性操作,同时也避免了传统锁机制所带来的线程阻塞和上下文切换的开销。因此,多线程CAS操作被广泛应用于各种高并发场景中,如数据库事务、分布式系统等。


目录
相关文章
|
4天前
|
调度 云计算 芯片
云超算技术跃进,阿里云牵头制定我国首个云超算国家标准
近日,由阿里云联合中国电子技术标准化研究院主导制定的首个云超算国家标准已完成报批,不久后将正式批准发布。标准规定了云超算服务涉及的云计算基础资源、资源管理、运行和调度等方面的技术要求,为云超算服务产品的设计、实现、应用和选型提供指导,为云超算在HPC应用和用户的大范围采用奠定了基础。
179562 18
|
12天前
|
存储 运维 安全
云上金融量化策略回测方案与最佳实践
2024年11月29日,阿里云在上海举办金融量化策略回测Workshop,汇聚多位行业专家,围绕量化投资的最佳实践、数据隐私安全、量化策略回测方案等议题进行深入探讨。活动特别设计了动手实践环节,帮助参会者亲身体验阿里云产品功能,涵盖EHPC量化回测和Argo Workflows量化回测两大主题,旨在提升量化投研效率与安全性。
云上金融量化策略回测方案与最佳实践
|
13天前
|
人工智能 自然语言处理 前端开发
从0开始打造一款APP:前端+搭建本机服务,定制暖冬卫衣先到先得
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。
9166 23
|
17天前
|
Cloud Native Apache 流计算
资料合集|Flink Forward Asia 2024 上海站
Apache Flink 年度技术盛会聚焦“回顾过去,展望未来”,涵盖流式湖仓、流批一体、Data+AI 等八大核心议题,近百家厂商参与,深入探讨前沿技术发展。小松鼠为大家整理了 FFA 2024 演讲 PPT ,可在线阅读和下载。
4853 12
资料合集|Flink Forward Asia 2024 上海站
|
17天前
|
自然语言处理 数据可视化 API
Qwen系列模型+GraphRAG/LightRAG/Kotaemon从0开始构建中医方剂大模型知识图谱问答
本文详细记录了作者在短时间内尝试构建中医药知识图谱的过程,涵盖了GraphRAG、LightRAG和Kotaemon三种图RAG架构的对比与应用。通过实际操作,作者不仅展示了如何利用这些工具构建知识图谱,还指出了每种工具的优势和局限性。尽管初步构建的知识图谱在数据处理、实体识别和关系抽取等方面存在不足,但为后续的优化和改进提供了宝贵的经验和方向。此外,文章强调了知识图谱构建不仅仅是技术问题,还需要深入整合领域知识和满足用户需求,体现了跨学科合作的重要性。
|
25天前
|
人工智能 自动驾驶 大数据
预告 | 阿里云邀您参加2024中国生成式AI大会上海站,马上报名
大会以“智能跃进 创造无限”为主题,设置主会场峰会、分会场研讨会及展览区,聚焦大模型、AI Infra等热点议题。阿里云智算集群产品解决方案负责人丛培岩将出席并发表《高性能智算集群设计思考与实践》主题演讲。观众报名现已开放。
|
13天前
|
人工智能 容器
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
本文介绍了如何利用千问开发一款情侣刮刮乐小游戏,通过三步简单指令实现从单个功能到整体框架,再到多端优化的过程,旨在为生活增添乐趣,促进情感交流。在线体验地址已提供,鼓励读者动手尝试,探索编程与AI结合的无限可能。
三句话开发一个刮刮乐小游戏!暖ta一整个冬天!
|
13天前
|
消息中间件 人工智能 运维
12月更文特别场——寻找用云高手,分享云&AI实践
我们寻找你,用云高手,欢迎分享你的真知灼见!
1002 67