ConcurrentHashMap并发

news2024/12/24 21:54:26

ConcurrentHashMap 并发

概述
jdk1.7概述

ConcurrentHashMap我们通过名称也知道它也是一个HashMap, 但是它底层JDK1.7与1.8的实现原理并不相同

在1.7中它内部维护一个Segment[]的数组, 加载因子0.75, 在创建一个长度为2的小数组HashEntry[], 在0索引处创建

image-20231213203430752

  • 根据键的哈希值计算出Sgement[]的索引
  • 如果为空,就创建一个长度为默认长度为2的数组
  • 再次利用键的哈希值计算出小数组应存入的索引(二次哈希)
  • 如果为空则直接添加

image-20231213203516205

image-20231213203537908

如果此时再来一个值地址值为索引4, 那么, 他会根据这个结构找到HashEntry中计算索引位置
如果为0, 则比较新旧值, 相同则不操作, 不相同则将新数据放在0索引处, 将老数据挂在新数据下
如果为1, 根据0.75加载因子应该先扩容2倍, 再将数据存入1索引

image-20231213203618787

1.7中ConncurrentHashMap的Segment[]的长度永远是16, 它扩容的是下面HashEntry[]

如果我们通过锁来限制线程的同步访问, HashMap将会锁住整个HashMap,而ConcurrentHashMap它只会锁住对应地址值的HashEntry[]

image-20231213203706406

总结:

  • 默认创建一个长度为16的Segment[],加载因子为0.75, 这个数组无法扩容
  • 还会同时创建一个长度为2的HashEntry[],将地址值赋值给0索引, 其他索引位置的元素都是null
  • 会根据键的hash值计算出大数组中的地址值,
  • 第一次,根据模版创建hashEntry[] 创建完毕,会二次哈希, 计算出在小数组中存入的位置
  • 如果根据键的hash值计算出大数组中的地址值不为null, 就会根据地址值找到下面的hashEntry[] 二次哈希计算存入位置,如果需要扩容则将hashEntry扩容两倍
  • 不需要扩容则比较, 没有元素就直接存, 有元素则比较, 如果不相同, 就会形成hash桶结构
jdk1.8 概述

底层结构: 数组+链表+红黑树

结合CAS机制+synchronized保证线程安全, 对比1.7可以看到初始化时候什么都没做

    public ConcurrentHashMap() {
    }

image-20231213203802435

如果为null,采用CAS算法获得地址值

image-20231213203821026

不为来就使用volatile关键字来获取地址值

image-20231213203909930

这里就越来越像我们之前看过的HashMap了

image-20231213203927432

总结:

  • 如果空参构造ConcurrentHashMap,则什么都不做, 只有在第一次添加元素的时候创建哈希表
  • 计算当前元素应该存在的索引
  • 判断索引为null, 将则利用CAS算法,将节点添加到数组中
  • 如果不为null, 则利用volatile关键字获得当前位置最新节点的地址值形成链表或者红黑树
  • 以链表或者红黑树节点为锁对象, 配合悲观锁(synchronized)保证多线程操作集合时的数据安全性
减小锁粒度

减小锁粒度是指缩小锁定对象的范围,从而减小锁冲突的可能性,从而提高系统的并发能力。减小锁粒度是一种削弱多线程锁竞争的有效手段,这种技术典型的应用是 ConcurrentHashMap(高性能的 HashMap)类的实现。对于 HashMap 而言,最重要的两个方法是 get 与 set 方法,如果我们对整个 HashMap 加锁,可以得到线程安全的对象,但是加锁粒度太大。Segment 的大小也被称为 ConcurrentHashMap 的并发度。

ConcurrentHashMap 分段锁

ConcurrentHashMap,它内部细分了若干个小的 HashMap,称之为段(Segment)。默认情况下一个 ConcurrentHashMap 被进一步细分为 16 个段,既就是锁的并发度。

如果需要在 ConcurrentHashMap 中添加一个新的表项,并不是将整个 HashMap 加锁,而是首先根据 hashcode 得到该表项应该存放在哪个段中,然后对该段加锁,并完成 put 操作。在多线程环境中,如果多个线程同时进行 put操作,只要被加入的表项不存放在同一个段中,则线程间可以做到真正的并行。

ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成

ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成。Segment 是一种可重入锁 ReentrantLock,在 ConcurrentHashMap 里扮演锁的角色,HashEntry 则用于存储键值对数据。一个 ConcurrentHashMap 里包含一个 Segment 数组,Segment 的结构和 HashMap类似,是一种数组和链表结构, 一个 Segment 里包含一个 HashEntry 数组,每个 HashEntry 是

一个链表结构的元素, 每个 Segment 守护一个 HashEntry 数组里的元素,当对 HashEntry 数组的数据进行修改时,必须首先获得它对应的 Segment 锁。

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

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

相关文章

【强化学习-读书笔记】有限马尔可夫决策过程

参考 Reinforcement Learning, Second Edition An Introduction By Richard S. Sutton and Andrew G. BartoMDP 是强化学习问题在数学上的理想化形式,因为在这个框架下我们可以进行精确的理论说明 智能体与环境的交互 智能体与环境交互,会得到轨迹&…

【教3妹学编程-算法题】消除相邻近似相等字符

插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 3妹:好冷啊, 冻得瑟瑟发抖啦 2…

【开源软件】最好的开源软件-2023-第22名 Apache Iceberg

自我介绍 做一个简单介绍,酒架年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【…

感知机(perceptron)

一、感知机 1、相关概念介绍 感知机(perceptron)是二分类的线性分类模型,属于监督学习算法。输入为实例的特征向量,输出为实例的类别(取1和-1)。 2、(单层)感知机存在的问题 感知机…

C语言指针基础题(二)

目录 例题一题目解析及答案 例题二题目解析及答案 例题三题目解析及答案 例题四题目解析及答案 例题五题目解析及答案 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒 个人主页 🥸🥸&#x1f…

C++ Java 嵌入式选哪个,该走哪个方向?

看一下最近几年的C Java 嵌入式薪资水平 图片来源:牛客2023校招春季与秋季白皮书 总结一下各届平均值,供大家参考,整体上薪资还是能反应一定的供需关系。 浅浅分析下: C领跑,整体波动不大,主要因为岗位较…

C语言之基本数据类型和数

目录 算数类型和基本数据类型 基数 基数转换 由八进制数、十六进制数、二进制数向十进制数转换 由十进制数向八进制数、十六进制数、二进制数转换 二进制和十六进制的基数转换 在学习基本数据类型之前我们先来学习数。 算数类型和基本数据类型 在前面的学习中我们可以使用…

Redis生产实战-热key、大key解决方案、数据库与缓存最终一致性解决方案

生产环境中热 key 处理 热 key 问题就是某一瞬间可能某条内容特别火爆,大量的请求去访问这个数据,那么这样的 key 就是热 key,往往这样的 key 也是存储在了一个 redis 节点中,对该节点压力很大 那么对于热 key 的处理就是通过热…

Source Tree回滚 重置 贮藏操作

回滚提交 source tree的回滚提交: 在执行该操作时将会对history中提交的指定节点直接进行回滚,将该节点执行的提交操作撤销(如当前节点是提交文件,执行回滚提交时将会删除该文件,如果当前节点的前面的节点对该节点内容进行修改后,执行回滚提交时需要执行冲突解决),同时生成一次…

【Axure高保真原型】能增删改的树形表格

今天和大家分享能增删改的树形表格的原型模板,包括展开、折叠、增加、修改、删除表格内容,那这个原型模板是通过中继器制作的,所以使用简单,只需要填写中继器表格,即可自动生成对应的树形表格。这个模板最高支持6级树形…

Prompt提示优化工具

在大模型使用过程中,Prompt尤为重要。一个好的Prompt可以解决很多的问题。那么如何撰写一个完美的Prompt? 下面汇总了一些Prompt工具,可以辅助日常Prompt的编写。 欢迎关注公众号 1. prompt perfect 可以自动优化已有的提示,比较多个模型的输出,运行智能体等。 https:…

操作系统复习资料【简答题】

分页和分段管理有何区别? 分页和分段都采用离散分配的方式,且都要通过地址映射机构来实现地址的转换,这是他们的共同点; 对于他们的不同点有三: 第一,从功能上看,也是信息的物理化单位&#…

想学精MySQL,得先捋一捋高可用架构

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

Java实现机考程序界面

机考界面如下(单选题),上方是题目状态,下方是题目,1/5/1是已做题目数量、总共题目数量和答对题目数量。 再看一下多选题的界面。 判断题的界面。 回答正确时的反馈,会给出用时。 回答错误时的反馈&#xff…

社会不教,精英不讲,坎儿还得自己过(揭秘人才成长规律)

推荐大家去看看天涯社区的精华帖子:《社会不教,精英不讲,坎儿还得自己过(揭秘人才成长规律)》 原出处天涯精华帖:《社会不教,精英不讲,坎儿还得自己过(揭秘人才成长规律&…

多模态AI:技术深掘与应用实景解析

多模态AI:技术深掘与应用实景解析 在当今人工智能技术的快速发展中,多模态AI凭借其独特的数据处理能力,成为了科技创新的前沿。这项技术结合了视觉、听觉、文本等多种感知模式,开辟了人工智能处理和理解复杂信息的新纪元。本文旨…

SpringBootWeb入门、HTTP协议、Web服务器-Tomcat

目录 一、SpringBootWeb入门 二、HTTP协议 HTTP-请求协议 HTTP-响应协议 HTTP-协议解析 三、Web服务器-Tomcat 服务器概述 Tomcat 一、SpringBootWeb入门 直接基于SpringFramework进行开发,存在两个问题:配置繁琐、入门难度大 通过springboot就…

最新鸿蒙HarmonyOS4.0开发登陆的界面1

下载deveco-studio 说明一下,本人只是学习中,现在只是拿着vue及uniapp的经验在一点一点的折腾,不过现在看来,鸿蒙入门并不是很难。也许是自己没有深入下去。 https://developer.harmonyos.com/cn/develop/deveco-studio#download…

对比SPI、UART、I2C通信的区别与应用

SPI、UART、I2C通信是常用的数字通信协议,它们在不同的场景下有不同的应用。下面,我将分别介绍它们的特点、区别与应用。 SPI通信 SPI通信是一种串行同步通信协议,它的全称为“Serial Peripheral Interface”。SPI通信是一种单主多从的通信方…

Ubuntu22.04终端设置白底黑字

概要:有两种白底黑字 第一种: 第二种: 一、第一种白底黑字 1、打开偏爱 先点击终端右上角的三个短横线的按钮,在展开中选择Preferences 2、设置终端的顶部为light 3、设置白底黑字 默认是使用来自系统主题的颜色,我…