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

从这三个方面来回答:
  • 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.mzph.cn/news/116731.shtml

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

相关文章

mysql的锁介绍

从共享性上来说,mysql的数据库锁分为: 共享锁(读锁):lock in share mode;一个事务获取了读锁之后,不排斥其他事务读数据,但排斥其他事务增删改。 排它锁(写锁):for update;一个事务获…

【ROS 2 基础-常用工具】-7 Rviz仿真机器人

所有内容请查看:博客学习目录_Howe_xixi的博客-CSDN博客

读书笔记——富兰克林自传

富兰克林自传 1.我从这件事得到一个启发,只要人们专心工作,就会活得非常快乐。在工作的日子里,他们往往温顺和气,心情愉快。白天痛痛快快地干活,晚上开开心心地吃喝。但是,一旦空闲无事,他们就…

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

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

常见面试题-Netty专栏(一)

typora-copy-images-to: imgs Netty 是什么呢?Netty 用于做什么呢? 答: Netty 是一个 NIO 客户服务端框架,可以快速开发网络应用程序,如协议服务端和客户端,极大简化了网络编程,如 TCP 和 UDP …

LVS+keepalived高可用集群

1、定义 keepalived为lvs应运而生的高可用服务。lvs的调度器无法做高可用,keepalived实现的是调度器的高可用,但keepalived不只为lvs集群服务的,也可以做其他代理服务器的高可用,比如nginxkeepalived也可实现高可用(重…

多模态笔记

Transformer 对文本输入进行tokenizer时,调用的接口batch_encode_plus,过程大致是这样的(参考:tokenizer用法) #这里以bert模型为例,使用上述提到的函数 from transformers import BertTokenizer tokenizer BertTokenizer.from…

spring tx:advice事务配置—— tx:advice中不允许出现属性 ‘transaction-manager‘

今天在配置java事务管理时出现了一些问题。 提示:只有这几个属性 经过查询资料发现是bean的配置少了一些。 可以在xml文件顶部添加: xmlns:tx"http://www.springframework.org/schema/tx" 下面也提供一份bean文件配置的模板: &a…

下列软件包有未满足的依赖关系: libqt5svg5-dev : 依赖: libqt5svg5 (= 5.12.8-0ubuntu1) 但是它将不会被安装

有一些软件包无法被安装。如果您用的是 unstable 发行版,这也许是 因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件 包尚未被创建或是它们已被从新到(Incoming)目录移出。 下列信息可能会对解决问题有所帮助: 下列软件包有未满足…

Java入门讲解(1)---让你瞬间明白如何安装jdk

博主有话说:学习这个东西一定要持之以恒!!!博主之前因为点事情半个月没学习,重新来过时,发现自己错过好多知识,正在一点一点往回补,博客也会陆续开始更新,希望大家多多支…

HarmonyOS SDK,赋能开发者实现更具象、个性化开发诉求

#鸿蒙生态千帆起#随着移动互联网的逐步成熟,用户的需求越来越细化。鸿蒙生态为开发者提供的HarmonyOS SDK开放能力,高效赋能美团外卖等合作伙伴实现更具象、个性化的开发诉求,给用户提供更丰富便捷的体验。 HarmonyOS SDK,赋能开发…

pb:数据处理窗口CloseQuery事件编程、如何在窗口之间传递结构

1、数据处理窗口CloseQuery事件编程 该事件下的脚本流程是首先判断数据是否修改过,如果修改过,则让用户选择是否保存,用户确认保存则保存,不保存则退回事务然后关闭窗口。保存数据时,保存成功则直接关闭窗口,保存失败则让用户确认是否关闭窗口,用户确认要关闭则关闭窗口…

【AI视野·今日CV 计算机视觉论文速览 第272期】Fri, 20 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Fri, 20 Oct 2023 Totally 62 papers 👉上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Putting the Object Back into Video Object Segmentation Authors Ho Kei Cheng, Seoung Wug Oh, Brian Price, Joon Youn…

(二)docker:建立oracle数据库mount startup

这章其实我想试一下startup部分做mount,因为前一章在建完数据库容器后,需要手动创建用户,授权,建表等,好像正好这部分可以放到startup里,在创建容器时直接做好;因为setup部分我实在没想出来能做…

php对接飞书机器人

有同事接到对接飞书机器人任务,开发中遇到响应错误: {"code": 19021,"msg": "sign match fail or timestamp is not within one hour from current time" } 意思应该就是签名错误或者时间戳不在有效范围内等&#xff0c…

【Python】取火柴小游戏(巴什博弈)

火柴游戏:Python编程示例 当我们想要玩一个简单而有趣的游戏,同时又想锻炼自己的编程技能时,一个经典的选择就是火柴游戏。这个游戏的规则很简单:有一堆火柴,每次可以拿走1到6根,两名玩家轮流取火柴&#…

Java NIO

Java NIO 一,介绍 Java NIO(New IO)是 JDK 1.4 引入的一组新的 I/O API,用于支持非阻塞式 I/O 操作。相比传统的 Java IO API,NIO 提供了更快、更灵活的 I/O 操作方式,可以用于构建高性能网络应用程序。 …

京东数据分析:2023年9月京东白酒行业品牌销售排行榜

鲸参谋监测的京东平台9月份白酒市场销售数据已出炉! 9月白酒市场的整体热度较高,贵州茅台先是与瑞幸联名推出酱香拿铁,后又宣布与德芙推出联名产品酒心巧克力,引起了诸多消费者的关注。在这一热度的加持下,从销售上看&…

深入理解Redis集群模式、协议、元数据维护方式

文章目录 🍊 集群模式🍊 集群协议🍊 元数据维护方式🎉 集中式🎉 gossip 协议 📕我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出…

第01章-Java语言概述

目录 1 常见DOS命令 常用指令 相对路径与绝对路径 2 转义字符 3 安装JDK与配置环境变量 JDK与JRE JDK的版本 JDK的下载 JDK的安装 配置path环境变量 4 Java程序的编写与执行 5 Java注释 6 Java API文档 7 Java核心机制:JVM 1 常见DOS命令 DOS(…