ConcurrentHashMap底层实现原理

news2024/11/17 10:26:10

ConcurrentHashMap底层实现原理

  • ConcurrentHashMap的整体架构
  • ConcurrentHashMap的基本功能
  • ConcurrentHashMap在性能方面的优化

ConcurrentHashMap的整体架构

1.8中的存储结构:
在这里插入图片描述
它是由数组、单向链表、红黑树组成的。

当们去初始化一个ConcurrentHashMap实例的时候,默认会初始化一个长度等于16的数组

由于ConcurrentHashMap的核心仍然是Hash表,所以必然会存在hash冲突的问题。所以ConcurrentHashMap采用链式寻址的方式来解决Hash表的冲突

当Hash冲突比较多的时候,会造成链表长度较长的问题,所以这种情况下会使得ConcurrentHashMap中的一个数组元素的查询复杂度会增加,所以在JDK1.8里面,引入了红黑树机制。

当数组长度大于64并且链表的长度大于等于8的时候,单向链表就会转化成红黑树。另外随着ConcurrentHashMap的一个动态扩容,一旦链表的长度小于8,红黑树会退化成单项链表。

ConcurrentHashMap的基本功能

本质上是一个HashMap,因此功能和HashMap是一样的。但是ConcurrentHashMap在HashMap的基础上提供了并发安全的一个实现。

并发安全的主要实现是通过对于Node节点去加锁来保证数据更新的安全性。
在这里插入图片描述

ConcurrentHashMap在性能方面的优化

如何在并发性能和数据安全性之间去做好平衡:
在很多地方都有类似的设计,比如说像cpu的三级缓存mysql的buffer_poolSynchronized的锁升级等等。

ConcurrentHashMap也做了类似的一个优化,主要体现在几个方面:

  1. 在JDK1.8里面,ConcurrentHashMap它的锁的粒度是数组中的某一个节点。而在JDK1.7里面,它锁定的是Segment,锁的范围要更大,所以性能上它会更低。
  2. 引入红黑树这样一个机制,去降低了数据查询的时间复杂度。红黑树的时间复杂度是O(logn)。
  3. 当数组的长度不够的时候,ConcurrentHashMap它需要对数组进行扩容,而在扩容的时间上,ConcurrentHashMap引入了多线程并发扩容的一个实现。简单来说,就是多个线程对原始数组进行分片,分片之后,每个线程去负责一个分片的数据迁移。从而去整体地提升了扩容过程中的数据迁移的一个效率。
    在这里插入图片描述
  4. ConcurrentHashMap它有一个size()方法来获取总的元素个数,而在多线程并发场景中,在保证原子性的前提下去实现元素个数的累加。性能是非常低的。所以ConcurrentHashMap在这个方面做了两个点的优化:
    当线程竞争不激烈的时候直接采用CAS的方式来实现元素个数的一个原子递增。如果线程竞争比较激烈的情况下,使用一个数组来维护元素的个数。如果要增加总的元素个数的时候,直接从数组中随机选择一个再通过CAS算法来实现原子递增。它的核心思想是引入了数组来实现对并发更新的一个负载。
    在这里插入图片描述
    参考资料:【Java面试】面试被问:ConcurrentHashMap 底层实现原理?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/455722.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【工具】FFmpeg|超大视频本地有损压缩,500MB变5MB(支持 Windows、Linux、macOS)

参考: 如何将一分钟长的1080p视频压缩至5MB以内?-知乎-滔滔清风近期HEVC扩展备用安装方法-B站-悲剧天下 总共三个步骤,安装FFmpeg、运行指令、打开视频。 亲测 500MB 变 5MB。 1 安装FFmpeg 对于不需要看教程可以自行完成安装的同学们&…

哪款手持洗地机更好用?好用的手持洗地机分享

家居卫生清洁对于每个家庭来说都是必不可少的事情,尤其是地面清洁更是需要重视。传统的清洁方法需要频繁更换工具才能完成吸、拖、吸的清洁步骤,而这个过程费时费力且效果并不尽如人意。然而,洗地机的出现完美地解决了这一问题,将…

【C++进阶之路】初始C++语法(下)

文章目录 一.引用1.基本概念2.使用场景函数参数函数返回值 3.优点4.指针与引用的区别 二.内联函数引入1.默认设置2.建议3.声明与定义(不同文件)add.cppadd.htest.cpp 三.auto1.必须有初始值2.只能确定一个类型3.auto可以为类型的一部分4.函数参数和自定义…

Ubuntu20.04部署YOLOv5

目录 前言一、环境配置1 显卡驱动安装1.1 卸载显卡驱动1.2 准备工作1.3 驱动安装1.4 验证 2 CUDA安装2.1 准备工作2.2 CUDA下载2.3 CUDA安装2.4 配置环境变量2.5 验证2.6 小结 3 cuDNN安装3.1 cuDNN下载3.2 cuDNN安装3.3 小结 4 TensorRT安装4.1 TensorRT下载4.2 TensorRT安装4…

UOS-----本地YUM源配置

1. cd /etc/apt/sources.list.d/ 将文件中的两个list配置文件内容注释掉,并保存 2. cd /etc/apt/ vi sources.list 将配置文件内容注释 3. cd /etc/apt/sources.list.d/ vi local.list (创建一个新的list文件,作为本地yum配置文件) 添…

电脑怎么压缩图片大小,4个通用方法分享

电脑怎么压缩图片大小?我相信这个问题很多小伙伴都遇到过的。我们压缩图片大小的主要原因是为了优化网站、应用程序或移动设备的性能。大尺寸的图片文件需要更多的存储空间和带宽,这将导致网页加载速度变慢,浪费用户时间并影响用户体验。此外…

香港科技大学有什么好的专业?

香港科技大学创办于1991年10月,是一所坐落于香港清水湾半岛的公立研究型大学。大学设有4个学院:工学院、理学院、人文社会科学学院和工商管理学院,还设有2个研究院:香港科技大学公共政策和行政研究生院和香港科技大学霍英东研究院…

nginx 配置代理ip访问https的域名配置

目录 问题背景 解决方式 正向代理: 反向代理: 通俗点儿一句话,正向与反向的区别: 问题背景 在某些单位或机构内部,访问互联网接口需要通过指定的服务器去访问,那我们就需要通过代理 ip 和 端口去访问外…

云计算基础——虚拟化

虚拟化技术简介 虚拟化是一个广义的术语,在计算机方面通常是指计算元件在虚拟的基础上而不是真实的基础上运行 虚拟化是一种经过验证的软件技术,它正迅速改变着IT的面貌,并从根本上改变着人们的计算方式 虚拟化是一个抽象层,它…

【C++学习】类和对象--运算符重载

运算符重载概念&#xff1a;对已有运算符重新定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型。 作用&#xff1a;实现两个自定义数据类型相加的运算。 目录 加号运算符重载 1.成员函数重载 2.全局函数重载 左移运算符重载<< 递增运算符重载 赋值…

java堆排序

堆排序是最基本的排序算法&#xff0c;简单来说就是把一堆数据&#xff08;数组&#xff09;分成两个相等的部分&#xff0c;其中一个部分作为数组的开头&#xff0c;另一个部分作为数组的结尾。之后在对这两个相等的部分进行比较&#xff0c;如果在比较之后发现这个数组中有一…

读懂什么是RDMA

一.什么是RDMA 1.RDMA主要体现 2.如何理解RDMA和TCP技术的区别&#xff1f; 3.使用RDMA的好处包括&#xff1a; 二.什么是RoCE&#xff1f; 1. RDMA协议包含: Infiniband&#xff08;IB&#xff09; 2. 为什么RoCE是目前主流的RDMA协议&#xff1f; …

GhostNet

文章目录 相关文章一、轻量化网络结构1. 分组卷积2. 深度可分离卷积 二、GhostNet1. 动机2. Ghost Module 相关文章 https://blog.csdn.net/search_129_hr/article/details/130280697 https://blog.csdn.net/c2250645962/article/details/104601305 一、轻量化网络结构 目的…

信息收集(一)域名信息收集

前言 信息收集也叫做资产收集。信息收集是渗透测试的前期主要工作&#xff0c;是非常重要的环节&#xff0c;收集足够多的信息才能方便接下来的测试&#xff0c;信息收集主要是收集网站的域名信息、子域名信息、目标网站信息、目标网站真实IP、敏感/目录文件、开放端口和中间件…

052:cesium加载网格地图

第052个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中加载grid地图。一个 ImageryProvider,它在每个具有可控背景和发光的图块上绘制线框网格。 可能对自定义渲染效果或调试地形很有用。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 …

redis 教程 6(Redis 的Pipeline , Lua)

Redis 的Pipeline, Lua PipelinePipeline简介为什么需要PipelinePipeline 性能测试与原生批量命令对比 LuaLua 与事物Lua 的用法Redis 如何管理Lua脚本 Pipeline Pipeline简介 Pipeline&#xff08;流水线&#xff09; 能够将一组redis命令进行组装&#xff0c; 通过一次RTT&…

fmriprep2

一. sub-subXXX文件夹 sub-subXXX.html 二. sub-subXXX文件夹 sub-sub097 / anat / figures / func / log / anat / anat文件夹内文件比较多&#xff0c;文件命名规则遵守BIDS要求( https://bids-specification.readthedocs.io/en/stable/05-derivatives/01-introduction.ht…

【国内chatgpt使用方法合集】

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

2023_4_23_VS下Release怎么打断点进行debug

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

MySQL——流程控制函数

在 MySQL 中&#xff0c;流程控制函数是指可以控制存储过程&#xff08;stored procedure&#xff09;或函数&#xff08;function&#xff09;中执行流程的语句。以下是几个常用的流程控制函数&#xff1a; 1. IF函数 实现IF……ELSE……的效果。 # 如果expr1为true&#x…