百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

一文详解ConcurrentHashMap的实现原理(含JDK1.7和JDK1.8区别)

yuyutoo 2025-03-26 18:54 3 浏览 0 评论


ConcurrentHashMap的实现原理基本都是大厂面试必考内容,而且对于掌握高并发编程也有很大的参考价值,本篇就来详解ConcurrentHashMap的底层实现机制@mikechen

首先,ConcurrentHashMap是HashMap的线程安全版本。

要理解ConcurrentHashMap的实现原理,都会涉及到背后的数据存储:哈希表。

所以,在谈ConcurrentHashMap的实现原理之前,我先从哈希表谈起,然后再循序渐进的谈

ConcurrentHashMap在JDK1.7和1.8之后的详细区别,这样更容易理解ConcurrentHashMap的实现原理@mikechen

01 哈希表

哈希表,英文名为:Hash表,也称散列表,是根据键值而直接进行访问的数据结构。

哈希表它通过把键值(key-value)映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做散列函数,存放记录的数组叫做散列表。

哈希表的数据结构:本质是数组加哈希函数,如下图所示:

key通过哈希函数,得到数组索引位置,然后就可以输出存储,查询也是通过索引来访问数组,所以哈希表的插入和查找的效率非常高,时间复杂度都是O(1)。


哈希表的应用场景

我们熟知的缓存技术,比如redis、memcached等分布式缓存,谈到背后的实现,本质就是:一张巨大的哈希表。

除此之外,还有大家熟知的HashMap、CurrentHashMap等,都是哈希表的应用。


JDK1.7下的CurrentHashMap底层实现

在 JDK 1.7 中,ConcurrentHashMap 的实现原理主要基于分段锁(Segment)的思想。

它将整个哈希表分成了多个小的哈希表段,每个段都对应着一个独立的锁,这样不同的线程可以同时访问不同的哈希表段,从而大大提高了并发性能。

如下图所示:

1.Segment(分段锁)

ConcurrentHashMap中的分段锁称为Segment,它即类似于HashMap的结构,即内部拥有一个Entry数组,数组中的每个元素又是一个链表,同时又是一个ReentrantLock(Segment继承了ReentrantLock)。


2.内部结构

具体来说,ConcurrentHashMap 中的哈希表结构由若干个哈希表段(Segment)组成,每个哈希表段都是一个独立的哈希表,它包含了一个 Entry 数组和一个独立的锁。

每个 Entry 表示一个键值对,其中包含了键、值和一个指向下一个 Entry 的指针。这些哈希表段组成了整个 ConcurrentHashMap 的哈希表结构,每个哈希表段都负责管理一部分键值对。

ConcurrentHashMap定位一个元素的过程需要进行两次Hash操作:

第一次Hash定位到Segment;

第二次Hash定位到元素所在的链表的头部;


3.该结构的优劣势

坏处

这一种结构的带来的副作用是Hash的过程要比普通的HashMap要长

好处

写操作的时候可以只对元素所在的Segment进行加锁即可,不会影响到其他的Segment。

总结:在JDK1.7中ConcurrentHashMap采用了:数组+Segment+分段锁的方式实现。


JDK1.8的CurrentHashMap实现原理

在 JDK 1.8 中,ConcurrentHashMap 的实现原理和 JDK 1.7 中有所不同。

JDK8中彻底放弃了Segment转而采用的是Node,其设计思想也不再是JDK1.7中的分段锁思想。

JDK8中ConcurrentHashMap参考了JDK8 HashMap的实现,采用了数组+链表+红黑树的实现方式来设计,内部大量采用CAS操作。

如下图所示:

1.数据结构

取消了Segment分段锁的数据结构,取而代之的是数组+链表+红黑树的结构。


2.保证线程安全机制

JDK1.7采用segment的分段锁机制实现线程安全,JDK1.8采用CAS+Synchronized保证线程安全。


3.链表转化为红黑树

定位结点的hash算法简化会带来弊端,Hash冲突加剧,因此在链表节点数量大于8时,会将链表转化为红黑树进行存储。


4.查询时间复杂度

从原来的遍历链表O(n),变成遍历红黑树O(logN)。


5.锁的粒度

原来是对需要进行数据操作的Segment加锁,现调整为对每个数组元素加锁,降低了锁的力度。

ConcurrentHashMap避免了对全局加锁改成了局部加锁操作,这样就极大地提高了并发环境下的操作速度。

以上

更多分布式架构系列、阿里架构师进阶系列,请查看以下文章:

阿里架构师进阶从0到1全部合集(建议收藏)

相关推荐

苹果要求全新App开发四月起必须支持“齐刘海”

今日消息,苹果公司通过邮件告知应用程序开发者,从2018年4月起提交给AppStore的所有新应用必须支持iPhoneX的超级视网膜显示器。这意味着新应用程序的开发者必须确保它们适应“齐刘海”,并...

耗时一年多,QEMU开发者成功在电脑上模拟了初版iPhone OS

IT之家12月24日消息,用户通过黑苹果(Hackintosh)工具,已经可以在非Mac设备上运行macOS系统。但由于种种限制,至今也没有多少人能够在PC上运行iOS系统。现...

下个月的WWDC后,苹果将发布原生Watch SDK测试版本

在近日Re/code举办的CodeConference上,苹果的运营副总裁JeffWilliams称,目前有4000多个AppleWatch应用上线,而未来的苹果表开发者套件,将允许开发者直接获...

苹果再次提醒:4月起强制要求APP进行适配

点击右上角关注我们,每天给您带来最新最潮的科技资讯,让您足不出户也知道科技圈大事!软件适配对于许多厂商来说都是一个比较头疼的事,苹果在握紧AppStore审核权的情况下情况要好许多。最近他们公布了...

苹果Xcode 16首个Beta版发布,AI代码补全最少需16GB内存

IT之家6月12日消息,在苹果WWDC24开发者大会上,苹果发布了iOS18、macOS15Sequoia等最新版本系统更新。与此同时,苹果推出了Xcode16开发工具的首...

传苹果已向特定开发者开放iWatch SDK

|责编:薄志强苹果会不会在这次发布会中发布全新的智能手表产品iWatch还很难说,不少人认为由于iWatch的消息少之又少,很可能这次还是没有iWatch。不过现在又有外媒传出消息称,苹果已经选定了...

苹果发布Swift 6语言:引入新测试框架、增强C++ 互操作性

IT之家9月20日消息,科技媒体devclass昨日(9月19日)报道,苹果公司在发布iOS/iPadOS18和macOS15Sequoia系统之外,还发布了Sw...

发布Siri SDK 之前苹果还是先想想这个问题

今年的GoogleI/O大会上,在预览GoogleHome时,我们就看到了设备可以互相对话的场景是多么惊艳,苹果快点跟上吧。最近因为亚马逊Echo和谷歌GoogleHome的火热...

iOS 17.2 SDK代码确认古尔曼爆料:免开箱更新苹果iPhone系统

IT之家10月27日消息,彭博社的马克古尔曼(MarkGurman)本月早些时候发布报道,称苹果正在研发新的系统,可以让员工在不拆开包装的情况下,升级iPhone的iOS系统。根据国...

《企业应用架构模式》之事件驱动架构

事件驱动架构(Event-DrivenArchitecture,EDA)是一种强调事件流和异步通信的应用程序架构。在该架构中,应用程序被分解为多个小型、可独立部署的组件,这些组件通过事件进行通信...

k8s中常用的controller以及用途和对应机制

controller的用途ReplicaSet、Deployment、StatefulSet:用于无状态和有状态应用的副本管理。DaemonSet:确保每个节点上都运行一个副本的控制器。...

Disruptor框架源码阅读-如何不重复消费

RingBuffer如何保证数据不丢失由于ringbuffer是一个环形的队列,那么生产者和消费者在遍历这个队列的时候,如何制衡呢?1、生产快,消费慢,数据丢失?生产者速度过快,导致一个对象还没消...

C# 控制电脑睡眠,休眠,关机以及唤醒

最近碰到一个关于芯片测试过程中的问题,这颗芯片是用在笔记本端口上,笔记本客户那边会有一个压力测试,就是频繁的电脑电源状态切换,S0(正常使用的开机状态),S3(睡眠模式),S4(休眠模式)以及S5(关...

大厂防止超卖的7种实现,很受用!(大厂防止超卖的7种实现,很受用的产品)

高并发场景在现场的日常工作中很常见,特别是在互联网公司中,这篇文章就来通过秒杀商品来模拟高并发的场景。本文环境:...

臻识车牌识别配制MQTT通讯,解析车号

在物联网项目中,我们的软件与车牌识别通讯,通常使用MQTT通讯更简单。...

取消回复欢迎 发表评论: