ConcurrentHashMap 原理

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.hqwc.cn/news/415451.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工厂企业消防安全AI可视化视频智能监管解决方案

一、方案背景 2023年11月20日下午6时30分许,位于江苏省无锡市惠山区前洲街道的某公司突发严重火灾,共造成7人死亡。这次火灾提醒我们工业安全至关重要,企业都应该时刻保持警惕,加强安全意识和培训,提高应对突发事件的…

前端框架前置课Node.js学习(1) fs,path,模块化,CommonJS标准,ECMAScript标准,包

目录 什么是Node.js 定义 作用: 什么是前端工程化 Node.js为何能执行Js fs模块-读写文件 模块 语法: 1.加载fs模块对象 2.写入文件内容 3.读取文件内容 Path模块-路径处理 为什么要使用path模块 语法 URL中的端口号 http模块-创建Web服务 需求 步骤: 案例:浏…

KubeSphere平台使用

KubeSphere官网地址:https://kubesphere.io/zh/ KubeKey一键部署K8S集群:https://kubesphere.io/zh/docs/v3.4/installing-on-linux/introduction/multioverview/ 一台master node(初始化主节点)、两台 work node( joi…

图片太模糊我们怎么提高清晰度呢

在数字时代,图片是我们日常生活中不可或缺的一部分。然而,有时候由于各种原因,我们得到的图片清晰度可能并不理想。这篇文章将介绍三款软件,帮助你提高图片的清晰度,让你的图片更加生动、清晰。 一、水印云 水印云是…

VUE--插槽slot(将父级的模块片段插入到子级中)

组件可以接收任意类型的JS值作为props,但我们想要为子组件传递一些模板片段,并在子组件中进行渲染时,此时可以采用插槽slot来实现 简单来说,插槽时组件内留一个或多个插槽的位置,供组件传递对应的模板代码(…

【不用找素材】ECS 游戏Demo制作教程(1) 1.15

一、项目设置 版本:2022.2.0f1 (版本太低的话会安装不了ECS插件) 模板选择3D URP 进来后移除URP(因为并不是真的需要,但也不是完全不需要) Name: com.unity.entities.graphics Version: 1.0.0-exp.8 点击…

非科班转码的秋招复盘:地理信息科学GIS专业到后端研发、软件开发

本文介绍地理信息科学(GIS)专业的2024届应届生,在研三上学期期间,寻找后端研发、软件开发等IT方向工作的非科班转码秋招情况。 首先,这篇文章一开始写于2023年年底,当时为了参加一个征文活动,所…

DApp:去中心化的革命与挑战

DApp(去中心化应用)是一种基于区块链技术的应用程序,与传统的中心化应用程序不同,DApp具有去中心化、透明、不可篡改等特性。本文将介绍DApp的前世今生,以及它的优势和未来发展。 DApp的前世可以追溯到区块链技术的出现…

【实战】K8S部署Redis集群代理Predixy

文章目录 前言技术积累为什么要在redis集群前面加个predixy代理?这样做的好处有哪些?常用代理配置网络存储 实战构建predixy镜像并部署下载predixy源码编译构建镜像创建K8S配置文件predixy-configmap并执行网络储存PV与PVC部署predixy-deployment 测试代…

CMake TcpServer项目 生成静态库.a / 动态库.so

CMake 实战构建TcpServer项目 静态库/动态库-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/135608829?spm1001.2014.3001.5501 在这篇博客的基础上,我们把头文件放在include里边,把源文件放在src里边,重新构建 hehedali…

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

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

AI视觉训练环境-【2】开发客户端搭建

本文介绍搭建一套简单的AI视觉训练环境的过程,作者也是刚开始接触机器视觉,现将学习过程中的搭建过程梳理下来分享给大家。创作过程实属不易,如不喜欢请轻轻绕过,如有建议无比欢迎,只愿我们共同进步。 训练环境 1.概述 开发环境基于yolov5进行训练演练,开发人员通过PyCha…