ConcurrentHashMap底层具体实现知道吗?实现原理是什么

news2025/1/11 14:54:32
从这三个方面来回答:
  • ConcurrentHashMap 的整体架构
  • ConcurrentHashMap 的基本功能
  • ConcurrentHashMap 在性能方面的优化

ConcurrentHashMap 的整体架构

这个是 ConcurrentHashMap 在 JDK1.8 中的存储结构,它是由数组、单向链表、红黑树组成. 当我们初始化一个ConcurrentHashMap实例时,默认会初始化一个长度为16的数组。由于ConcurrentHashMap的核心仍然是 hash 表,所以必然会存在 hash 冲突问题.ConcurrentHashMap 采用链式寻址法来解决 hash 冲突。.当 hash 冲突比较多的时候,会造成链表长度较长,这种情况会使得ConcurrentHashMap 中数据元素的查询复杂度变成 O(n)。因此在 JDK1.8 中,引入了红黑树的机制。当数组长度大于 64 并且链表长度大于等于 8 的时候,单项链表就会转换为红黑树。另外,随着 ConcurrentHashMap 的动态扩容,一旦链表长度小于 8,红黑树会退化成单向链表

ConcurrentHashMap 的基本功能 

ConcurrentHashMap 本质上是一个 HashMap,因此功能和 HashMap 一样,但是CocurrentHash
Map 在 HashMap 的基础上,提供了并发安全的实现。并发安全的主要实现是通过对指定的 Node节点加锁,来保证数据更新的安全性。

ConcurrentHashMap 在性能方面做的优化

如果在并发性能和数据安全性之间做好平衡,在很多地方都有类似的设计,比如 cpu的三级缓存、mysql 的 buffer_pool、Synchronized 的锁升级等等。ConcurrentHashMap 也做了类似的优化,主要体现在以下几个方面:
  • 在 JDK1.8 中,ConcurrentHashMap 锁的粒度是数组中的某一个节点,而在JDK1.7,锁定的是 Segment,锁的范围要更大,因此性能上会更低。
  • 引入红黑树,降低了数据查询的时间复杂度,红黑树的时间复杂度是 O(logn)。
  • 当数组长度不够时,ConcurrentHashMap 需要对数组进行扩容,在扩容的实现上,ConcurrentHashMap 引入了多线程并发扩容的机制,简单来说就是多个线程对原始数组进行分片后,每个线程负责一个分片的数据迁移,从而提升了扩容过程中数据迁移的效率。

 

  • ConcurrentHashMap 中有一个 size()方法来获取总的元素个数,而在多线程并发场景中,在保证原子性的前提下来实现元素个数的累加,性能是非常低的。ConcurrentHashMap 在这个方面的优化主要体现在两个点:
  1. 当线程竞争不激烈时,直接采用 CAS 来实现元素个数的原子递增。
  2. 如果线程竞争激烈,使用一个数组来维护元素个数,如果要增加总的元素个数,则直接从数组中随机选择一个,再通过 CAS 实现原子递增。它的核心思想是引入了数组来实现对并发更新的负载。

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

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

相关文章

谈谈你对Spring的理解

谈谈你对Spring的理解 一,什么是Spring 1.介绍 Spring是一个用于开发Java应用程序的工具集合,它提供了许多方便的组件和工具,可以帮助开发者更轻松地构建企业级应用程序。 Spring Framework是Spring的核心部分,它可以帮助开发者…

windows的adb环境安装

需要配置androidhome和一些path

基于情感分析的网络舆情热点分析系统 计算机竞赛

文章目录 0 前言1 课题背景2 数据处理3 文本情感分析3.1 情感分析-词库搭建3.2 文本情感分析实现3.3 建立情感倾向性分析模型 4 数据可视化工具4.1 django框架介绍4.2 ECharts 5 Django使用echarts进行可视化展示5.1 修改setting.py连接mysql数据库5.2 导入数据5.3 使用echarts…

2023年信息科学与工程学院学生科协第二次软件培训

2023年信息科学与工程学院学生科协第二次软件培训 文章目录 2023年信息科学与工程学院学生科协第二次软件培训一维数组数组的概念定义格式一维数组的访问例题:练习题: 数组元素数量一维数组的初始化 二维数组定义格式二维数组的访问二维数组的存储结构二…

实现多余内容变成省略号

实现效果 代码 <p class"item-content">{{ item.content }}</p>样式 .item-content {white-space: nowrap;/* 禁止换行 */overflow: hidden;/* 隐藏溢出部分 */text-overflow: ellipsis;/* 使用省略号表示溢出部分 */ }

21.4 Python 使用GeoIP2地图定位

GeoIP2是一种IP地址定位库&#xff0c;它允许开发人员根据IP地址查找有关位置和地理位置的信息。它使用MaxMind公司的IP地址数据库&#xff0c;并提供一个方便的Python API。GeoIP2可以用于许多不同的应用程序&#xff0c;例如网站分析、广告定位和身份验证。GeoIP2提供了许多不…

达梦管理工具报错“结果集不可更新,请确认查询列是否出自同一张表,并且包含值唯一的列。”

在使用达梦数据库管理工具时&#xff0c;我们测试过程中时常需要更新表数据&#xff0c;有时为了便捷&#xff0c;会直接使用管理工具修改表数据的值&#xff0c;但偶尔会遇到“结果集不可更新&#xff0c;请确认查询列是否出自同一张表&#xff0c;并且包含值唯一的列。”的报…

天津五家受欢迎的python培训机构 python凭什么这么火?

在目前的编程语言中&#xff0c;Python的抽象程度是最高的&#xff0c;是最接近自然语言的&#xff0c;非常容易上手&#xff0c;许多想学编程的小伙伴都从python入手&#xff0c;今天我们就来聊聊关于大家非常困惑的一些点&#xff0c;下面就一起来看看吧。 python火的原因 …

Java的反射(reflection)机制的简单使用

目录 一、定义 二、用途 三、反射基本信息 四、反射相关的类 五、反射示例 六、反射的优点和缺点 一、定义 Java的反射机制是运行时的状态&#xff0c;可以通过反射来调用类里面的属性和方法&#xff0c;私有的属性和方法也可以调用&#xff0c;也可以对它们进行修改。 二…

React 核心与实战2023版

课程亮点: 完整的前后台项目(PC+移动;完成业务;)React 最新企业标准技术栈(React 18 + Redux + ReactRouter + AntD)React + TypeScript (为大型项目奠定了基础)课程内容安排: React 介绍 React 是什么? React 是由Meta公司研发,是一个用于 构建Web和原生交互界面…

升级 Xcode 15模拟器 iOS 17.0 Simulator(21A328) 下载失败

升级 IDE Xcode 15 后本地模拟器 Simulator 全被清空,反复重新尝试 Get 下载频频因网络异常断开而导致失败 ... 注:通过 Get 方式下载一定要保证当前网络环境足够平稳,网络环境不好的情况下该方法几乎成不了 解决办法 Get 方式行不通可以尝试通过 官网 途径先下载 模拟器安装包…

电脑待办事项提醒工具用哪个?

在一个繁忙的办公楼里&#xff0c;人们匆匆忙忙地穿梭着&#xff0c;电脑屏幕前的每个人都有着繁重的工作任务。为了应对这些任务&#xff0c;有人喜欢在纸上列出清单&#xff0c;有人则更愿意在电脑上记录&#xff0c;日常记录待办事项建议大家可以使用提醒工具敬业签。 敬业…

ubuntu 22.04 截图工具 shutter

sudo apt install shutter 快捷键F1 注意不支持wayland&#xff0c;登录时不要选择ubuntu wayland

Java并发编程第10讲——CAS相关知识点详解

前面介绍锁的时候顺便也提到了CAS&#xff0c;但作为JUC的“基石”和面试中的高频考点&#xff0c;还是不够。所以&#xff0c;本篇文章将从CAS的概念入手&#xff0c;逐步深入介绍12个Atomic原子操作类、CAS的实现原理&#xff08;源码解析&#xff09;、Unsafe类、CAS存在的问…

Oracle通过透明网关查询SQL Server 报错ORA-00904

Oracle通过透明网关查询SQL Server 报错ORA-00904 问题描述&#xff1a; 只有全表扫描SELECT * 时SQL语句可以正常执行 添加WHERE条件或指定列名查询&#xff0c;查询语句就报错 问题原因&#xff1a; 字段大小写和SQLSERVER中定义的不一致导致查询异常 解决办法&#xff1a; 给…

JVM——堆内存调优(Jprofiler使用)Jprofile下载和安装很容易,故没有记录,如有需要,在评论区留言)

堆内存调优 当遇到OOM时&#xff0c;可以进行调参 1、尝试扩大堆内存看结果 2、分析内存&#xff0c;看哪个地方出现了问题&#xff08;专业工具&#xff09; 调整初始分配内存为1024M&#xff0c;调整最大分配内存为1024M&#xff0c;打印GC细节&#xff08;如何添加JVM操…

「快学Docker」Docker镜像和容器的创建与管理

「快学Docker」Docker镜像和容器的创建与管理 引言什么是Docker镜像&#xff1f;镜像获取和使用镜像获取镜像使用 什么是Docker容器&#xff1f;Docker容器与主机之间的交互基于Dockerfile创建镜像基于镜像创建容器总结 引言 Docker镜像和容器是当今云计算领域中最受欢迎的技术…

【Buildroot】记一次编译出错gzip: popt-1.16.tar.gz: not in gzip format--更改br里面的默认下载地址

文章目录 我在一次正常的编译过程中遇到了&#xff0c;如下的错误&#xff1a; rootubuntu:/home/liefyuan/Linux/rk356x_linux/buildroot# make -j16 make: Circular /home/liefyuan/Linux/rk356x_linux/buildroot/output/build/iproute2-4.14.1/.stamp_configured <- bus…

Trie树/字典树的原理及实现[C/C++]

文章目录 前言引例&#xff1a;Google经典面试题字典树的原理与实现定义字典树的结构字典树的操作字符串插入字符串查询 字典树的实现字符集数组法节点类结构设计节点的接口字符映射节点类的代码实现 字典树类结构设计字典树接口实现 字符集映射法&#xff08;适用性广&#xf…

idea使用Alibaba Cloud Toolkit实现自动部署

在日常开发过程中&#xff0c;经常会使用到jenkins进行项目部署&#xff0c;但对一些小项目来说&#xff0c;这就过于复杂&#xff0c;就可以使用Alibaba Cloud Toolkit插件配合shell脚本进行项目的远程部署工作。 一、下载Alibaba Cloud Toolkit插件 二、服务器安装nohup 1.…