ConcurrentHashMap 原理

news2024/9/28 1:18:56

ConcurrentHashMap

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

concurrentHashMap:

ConcurrentHashMap的整体架构

concurrentHashMap是由数组+链表+红黑树组成
在这里插入图片描述
当我们初始化一个ConcurrentHashMap实例时,默认会初始化一个长度为16的数组。
当发生hash冲突时,会使用链式方式解决。
当链式长度大于8且数组长度大于64 并且负载因子达到0.75的时候,链表会转成红黑树。
随着concurrentHashMap的动态扩容,一旦链表长度小于8,红黑树会退化成单向链表。

ConcurrentHashMap的基本功能

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

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

ConcurrentHashMap在性能方面的优化

如果在并发性能和数据安全之间做好平衡,在很多地方都有类似的设计,比如cpu的三级缓存,mysql的buffer_pool,synchronzie的锁升级等。
ConcurrentHashMap优化:
1,在jdk1.8中,concurrentHashMap锁的粒度是数组中的某一个节点,而在JDK1.7中,锁定的是segment,锁的范围更大,因此性能会更低。
2,引入了红黑树,降低了数据查询的时间复杂度,Ologn
3,当数组长度长度不够时,ConcurrentHashMap会对数组进行扩容,在扩容的实现上,ConcurrentHashMap引入了多线程并发扩容机制。
简单来说就是多线程对原是数组进行分片后,每个线程负责一个分片的数据迁移,从而提升了扩容过程中的数据迁移效率
在这里插入图片描述
4,concurrentHashMap中有一个Size()方法来获取总的元素个数,在多线程并发场景中,在保正原子性的情况下实现元素个数的累加,性能时非常低的。
当并发不高时,直接采用CAS实现元素个数的原子递增。
如果线程竞争激烈,使用一个数组来维护元素个数,如果要增加总的元素个数,则直接从数组中随机取一个,在通过CAS实现原子递增,他的核心思想是引入数组来实现对并发更新的负载
在这里插入图片描述

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

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

相关文章

Gin 框架之用户密码加密

文章目录 一、引入二、密码加密位置三、如何加密四、bcrypt 库加密4.1 介绍4.2 优点:4.3 使用 五、小黄书密码加密实践 一、引入 Gin是一个用Go语言编写的Web框架,而用户密码的加密通常是在应用程序中处理用户身份验证时的一个重要问题。 通常敏感信息…

刘阳,定格历史,守护中华文化!

2021年2月24日,#圆明园365张珍贵老照片#的话题凭3.7亿阅读量冲上热搜。这批时代跨越80年的老照片仿佛重启记忆的按钮,让人梦回“夏宫”;少有人知道,它们的拥有者,却是一位不折不扣的80后。 刘阳,土生土长北…

Python初学者须知(9)Return有什么用——初识Return语句

本系列博客主要针对的是Python初学者。Python语言简洁、强大的特性吸引了越来越多的技术人员将他们的项目转移到Python上。目前,Python已经成为计算机行业最流行的编程语言之一。笔者考虑到Python初学者的多元化(Python学习者可能是对编程感兴趣的中学生…

mysql数据迁移报错Specified key was too long; max key length is 767 bytes

目录 场景: 说明: 疑问: 解决: 验证: 场景: 线上项目支持的过程中遇到mysql库表结构和数据由A库迁移到B库上提示Specified key was too long; max key length is 767 bytes报错,第一次遇到特此…

【保姆级教程|YOLOv8改进】【3】使用FasterBlock替换C2f中的Bottleneck

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

20. 从零用Rust编写正反向代理,四层反向代理stream(tcp与udp)实现

wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子 项目地址 gite: https:…

Acrel-1000DP分布式光伏系统在某重工企业18MW分布式光伏中应用

摘 要:分布式光伏发电特指在用户场地附近建设,运行方式以用户侧自发自用、余电上网,且在配电系统平衡调节为特征的光伏发电设施,是一种新型的、具有广阔发展前景的发电和能源综合利用方式,它倡导就近发电,就…

回溯算法篇-01:全排列

力扣46:全排列 排列和组合的区别在于,排列对“顺序”有要求。比如 [1,2] 和 [2,1] 是两个不同的结果。 这就导致了同一个元素 在同一条路径中不可重复使用,在不同的路径中可以重复使用。 比如数组 [1,2,3] ,在第一条路径 [1,2,…

【jQuery入门】基础使用-入口函数、顶级对象$

文章目录 前言一、基础使用1.1 jQuery的下载1.2 简单的使用 二、顶级对象$总结 前言 jQuery是一款广泛应用于前端开发的JavaScript库,它简化了许多常见任务的操作,使得代码编写更加便捷。本文将介绍jQuery的基础使用,包括入口函数和顶级对象…

IPFoxy运营干货|谷歌广告Google Ads建立广告需要注意什么?

编辑投放谷歌广告需要多少个步骤和什么准备工作,本文将来讲述,主要分5个内容:一、投放前竞对研究;二、投放前广告账户设置;三、建立广告系列;四、建立广告组;五、广告长期策略。接下来我们来开始…

防火墙技术

防火墙(英语:Firewall)技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。 防火墙技术的功能主要在于及…

【安装VMware Tools】实现Vmware虚拟机和主机之间复制、粘贴内容、拖拽文件

https://www.bilibili.com/video/BV1rN411277B/?spm_id_from333.788.recommend_more_video.6&vd_sourcefb8dcae0aee3f1aab700c21099045395 https://blog.csdn.net/wxqian25/article/details/19406673 待解决方案: 重新下载ubuntu,然后按照 https://…

C#:接口中如何将某个值类型的字段传null?

在实际对接第三方接口时,偶尔会有一些字段在某些情况下是不需要传值的。那如何处理呢? 有两种方法: 1、将值类型改为可空类型; 2、定义基类,基类包含所有必须要传的字段,子类则加入偶尔需要传的字段。 下…

制造业企业数字化转型难点剖析及解决之法

导语 全球正在由工业经济向数字经济转型过渡,制造业正在且并将长期处于数字化转型发展阶段,并沿着数字化、网络化、智能化阶段不断跃升。但如何找准数字化转型的切入点,以低耗能、低成本、高效率的方式加快制造业转型升级的步伐,仍…

米粒图像预处理-图像背景均匀化

案例背景 食品检测在国家粮食安全中拥有举足轻重的地位。随着经济全球化程度的深入,中国巨大的市场消费力将吸引越来越多的国际米类品牌的进入,国内粮食市场的竞争将会日趋激烈,人们越来越注重粮食的安全和品质问题,粮食质量检测…

Sublime Text4 crack时替换的汇编指令

Sublime Text4 crack时替换的汇编指令 首先请支持正版,这里研究破解的步骤,仅做汇编代码学习。 破解步骤很简单: 打开二进制文件, 搜索 80 78 05 00 0F 94 C1, 替换为 C6 40 05 01 48 85 C9. (源: https://gist.git…

SQL Server中数据表的增删查改

文章目录 一、增二、查三、改四、删除 一、增 进行增删查改的前提需要在指定数据库中创建数据表,对这块不大理解的可以先看看前面几期文章: 创建数据库 创建数据表 use StudentManageDB go insert into Students (StudentName,Gender,Birthday,Age,Stu…

【图形学】直线光栅化算法(DDA算法,Bresenham算法和中点算法)

在数学上,直线就是由无穷多个点组成的, 在计算机屏幕显示的话, 需要做一些处理,对于光栅显示器,就是用有限多个点去逼近直线, 我们需要知道每一个像素点的坐标(都是整数) 数学上直线的方程如下 y k x b ykxb ykxb,给定直线的起点坐标 P 0 ( x 0 , y…