一文详解ConcurrentHashMap的实现原理(含JDK1.7和JDK1.8区别)
yuyutoo 2025-03-26 18:54 7 浏览 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避免了对全局加锁改成了局部加锁操作,这样就极大地提高了并发环境下的操作速度。
以上
更多分布式架构系列、阿里架构师进阶系列,请查看以下文章:
相关推荐
- Python操作Word文档神器:python-docx库从入门到精通
-
Python操作Word文档神器:python-docx库从入门到精通动动小手,点击关注...
- Python 函数调用从入门到精通:超详细定义解析与实战指南 附案例
-
一、函数基础:定义与调用的核心逻辑定义:函数是将重复或相关的代码块封装成可复用的单元,通过函数名和参数实现特定功能。它是Python模块化编程的基础,能提高代码复用性和可读性。定义语法:...
- 等这么长时间Python背记手册终于来了,入门到精通(视频400集)
-
本文毫无套路!真诚分享!前言:无论是学习任何一门语言,基础知识一定要扎实,基础功非常的重要,找一个有丰富编程经验的老师或者师兄带着你会少走很多弯路,你的进步速度也会快很多,无论我们学习的目的是什么,...
- 图解Python编程:从入门到精通系列教程(附全套速查表)
-
引言本系列教程展开讲解Python编程语言,Python是一门开源免费、通用型的脚本编程语言,它上手简单,功能强大,它也是互联网最热门的编程语言之一。Python生态丰富,库(模块)极其丰富,这使...
- Python入门教程(非常详细)从零基础入门到精通,看完这一篇就够
-
本书是Python经典实例解析,采用基于实例的方法编写,每个实例都会解决具体的问题和难题。主要内容有:数字、字符串和元组,语句与语法,函数定义,列表、集、字典,用户输入和输出等内置数据结构,类和对象,...
- Python函数全解析:从入门到精通,一文搞定!
-
1.为什么要用函数?函数的作用:封装代码,提高复用性,减少重复,提高可读性。...
- Python中的单例模式:从入门到精通
-
Python中的单例模式:从入门到精通引言单例模式是一种常用的软件设计模式,它保证了一个类只有一个实例,并提供一个全局访问点。这种模式通常用于那些需要频繁创建和销毁的对象,比如日志对象、线程池、缓存等...
- 【Python王者归来】手把手教你,Python从入门到精通!
-
用800个程序实例、5万行代码手把手教你,Python从入门到精通!...
- Python从零基础入门到精通:一个月就够了
-
如果想从零基础到入门,能够全职学习(自学),那么一个月足够了。...
- Python 从入门到精通:一个月就够了
-
要知道,一个月是一段很长的时间。如果每天坚持用6-7小时来做一件事,你会有意想不到的收获。作为初学者,第一个月的月目标应该是这样的:熟悉基本概念(变量,条件,列表,循环,函数)练习超过30个编...
- Python零基础到精通,这8个入门技巧让你少走弯路,7天速通编程!
-
Python学习就像玩积木,从最基础的块开始,一步步搭建出复杂的作品。我记得刚开始学Python时也是一头雾水,走了不少弯路。现在回头看,其实掌握几个核心概念,就能快速入门这门编程语言。来聊聊怎么用最...
- 神仙级python入门教程(非常详细),从0到精通,从看这篇开始!
-
python入门虽然简单,很多新手依然卡在基础安装阶段,大部分教程对一些基础内容都是一带而过,好多新手朋友,对一些基础知识常常一知半解,需要在网上查询很久。...
- Python类从入门到精通,一篇就够!
-
一、Python类是什么?大家在生活中应该都见过汽车吧,每一辆真实存在、能在路上跑的汽车,都可以看作是一个“对象”。那这些汽车是怎么生产出来的呢?其实,在生产之前,汽车公司都会先设计一个详细的蓝图...
- 学习Python从入门到精通:30天足够了,这才是python基础的天花板
-
当年2w买的全套python教程用不着了,现在送给有缘人,不要钱,一个月教你从入门到精通1、本套视频共487集,本套视频共分4季...
- 30天Python 入门到精通(3天学会python)
-
以下是一个为期30天的Python入门到精通学习课程,专为零基础新手设计。课程从基础语法开始,逐步深入到面向对象编程、数据处理,最后实现运行简单的大语言模型(如基于HuggingFace...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)