编程(43)----------ConcurrentHashMap

news/2025/3/1 3:40:04/

在多线程中使用哈希表, 首先是不能使用HashMap的. 因为其本身并非线程安全. 与其相反HashTable则是安全的. 其原因在于本身给关键的方法加了锁. 但即便如此, 与HashTable相比, 更推荐使用ConcurrentHashMap. 其原因在于, 它在HashTable的基础上做了较多的优化:

上述提到, HashTable线程安全的前提是加锁. 但其加锁是对方法加锁. 这意味着其加锁对象是this, 加了一把大锁. 

                                                                            

如图所示, 在这个哈希表中, 假设有两个线程要对key为1的链表中的a, b进行增删查改. 很显然, 若不进行加锁, 就会引发线程安全. 因此当其中一个线程访问时, 整个哈希表都相当于加了一个大锁, 进而防止线程安全.

但如果两个线程访问的是c和d呢? 很显然这个时候其实无需加锁. 因为二者根本是在不同的链表上的. 在这种情况下加锁毫无意义. 二者访问根本不会收到影响. 只会白白因为加锁而浪费资源和时间.

因此, ConcurrentHashMap优化的第一个地方就是将这个大锁进行细化. 在JDK1.8以前, 是将哈希表数组中的每几个进行上锁. 但是这样效果并不好, 之后就直接进行单独加锁. 即将每个链表的头结点作为加锁对象.  这样既可以保证访问同一个链表时加锁, 不同链表之间也能有效同时进行访问.

                                                                             

 ConcurrentHashMap第二个优化的地方是其只针对写操作加锁. 也就是说ConcurrentHashMap的读和写之间是没有冲突的. 换句话说, 完全可能存在脏读. 读到只写完一半的数据. 为避免出现这种情况, ConcurrentHashMap使用如volatile和代码的控制以实现原子性.

同时ConcurrentHashMap也尽量多使用了CAS, 以减少加锁次数. 但无论如何, 其效率的提升也不过是相对的.

ConcurrentHashMap第三个优化的地方是扩容. 哈希表的扩容是put操作使其元素数量达到所规定的负载因子时, 会创建一个更大的数组空间将旧数组中的所有数据搬运过去. 但问题在于, 如果数据量本身很大, 那这个搬运过程是极其耗时耗力的. 很可能出现运行卡顿.

ConcurrentHashMap所采用的也是化大为小进行搬运. 在进行扩容后,  会将新旧数组同时进行保留.每次put就将数据放到新数组中, 同时也从旧数组中搬运一部分到新数组中. 如此反复, 最后搬运结束. 这样搬运避免一次性搬运过多的数据而造成卡顿. 

-------------------------------最后编辑于2023.7.3 晚上八点半左右


http://www.ppmy.cn/news/705641.html

相关文章

高性能远程接入方案 OpenText Exceed TurboX (ETX) 的优势以及在 EDA、制造、能源和医疗行业的应用

引领远程工作的IT新高度 组织一直承受着改进工作流程、降低成本和比以往更快地交付产品的压力。使用远程访问和集中式 IT 基础架构,企业可以在加快上市时间方面取得重大飞跃,同时从大幅降低成本中受益。 尽管工作人员可以远程操作要求苛刻的图形软件解决…

UE4/5自定义生成Metahuman,照片生成美少女?我生成了个怪胎!

众所周知,做数字人的头部方法有很多,甚至只需要一张证件照即可! 所以,我在网上找了一张图片,试图去生成一个美少女,结果。。。 废话不多说,我们直接开始: 制作: 【记…

【国产虚拟仪器】基于ZYNQ7045+V7 FPGA的多通道数据同步采集设计方案(二)

多通道数据采集电路主要流程为实现4路模拟信号接收,通过模数转换、信 号处理后的数据经过光纤传输到总站。多通道数据采集电路由模拟信号采集单元、 数字信号处理单元和信号转接板构成,组成框图如图4-1所示。 为了对带宽内的多个关键频点进行侦察监测&a…

写给产品经理的技术书:客户端、服务端和交互相关技术

产品经理有三大领域的技术是需要去攻克的,分别是:客户端相关技术、服务端相关技术、交互相关技术 一、客户端相关技术 1.iOS和安卓产品差异 1.1 应用的设备不同: IOS和安卓最大的区别在于本身所应用的设备不同。IOS系统主要是应用…

RemoteTestkit远程真机调试平台使用教程

虽然Remote testkit在国内的热度较低。但是在日本和韩国地区使用该平台的数量偏偏超过了国内的testin和testbird的水平。今天教大家如何使用remote testkit Remote testkit是由日本电信公司NTT Resonant(日文:NTTレゾナント)旗下的开发平台。韩国方面由wemb代理。该平台入驻企…

萝卜视频源码前后端带视频演示更换播放内核到3.2.6

介绍: 版本特性:更换播放内核到3.2.6,原版3.0.2 一、广告 开屏广告 播放页下方广告 激励广告 二、视频观看: 1、芒果,只要能解就能播放 2、支持B站。 只要能解就能播放 3、修复点播 4、修复全屏/锁屏系统返回键 5、恢…

M1 Pro 折腾一年的心得:一堆很“哇塞”的技巧和 App

前言 随着 M1 的横空出世,越来越多的企业和个人转入 Mac 生态。而由于和 Windows 平台的不同,Mac 始终有些使用上的痛点。笔者使用 M1 Pro 近一年,倾情分享折腾出来的一堆使用技巧和珍藏 App,希望能够能够将 Mac 玩得更溜、效率更…

IOS系统历届版本大回顾(iOS7)

APPLE,一种常见的水果,但在人类的进化史上扮演了2次拯救世界的角色。 第一次是在1666年一个夏末的傍晚,在英格兰林肯郡的乌尔斯索普,当一个年轻人坐在树下,埋头读书的时候,一个苹果奋力挣脱了树枝的束缚&am…