ConcurrentHashMap进阶面试题

news2024/11/24 18:28:01

ConcurrentHashMap 1.8的优化

  1. 存储的时候的优化
  2. 写数据的时候加锁的优化
  3. 扩容时的优化,有一个协助扩容的概念
  4. 计数器的优化,在记录元素个数时,使用的类似与longAdder的形式,不会过度消耗CPU资源
    在这里插入图片描述
    为什么多线程情况下longAdder会比atomic性能优化?
 AtomicLong VS LongAdder
 LongAdder适合的场景是统计求和计数的场景
 在竞争激烈的情况下,LongAdder的效率比AtomicLong高,但要消耗更多的空间
 
 LongAdder 性能优势
 LongAdder 的基本思路是分散热点,
 AtomicLong 中存在成员变量 value 保存 long 值,在高并发的情况下该 value 值是一个热点,由 N 个线程竞争;
 LongAdder 将 value 值分散到一个数组中,不同的线程命中到数组的不同的槽中,
 各线程仅仅对自己槽中的值进行 CAS 操作,从而分散热点减少冲突

ConcurrentHashMap 为什么使用散列算法

  1. 可以让key的hash的高位和低位都参与到计算当中,与右移16位后的本身做异或运算是为了让高16位也参与运算,使得结果更加的随机,不然基本大多数情况只有低位参与运算。而之所以选择异或运算,是因为,异或运算的结果更平均,例如1和0做异运算,(1和1,1和0,0和1,0和0)4种情况有3种结果是0,一种是1。或运算则1种结果为1,3种为0。而异或运算是2种结果为1,2种结果为0.更平均。 更加的随机+更加的平均 + 没有负数???
    在这里插入图片描述

ConcurrentHashMap 初始化数组的流程

  1. sizeCtl这个属性是数组在初始化和扩容操作时的一个控制变量
  2. 在初始化数组的时候,用了DCL的概念,先判断了数组初始化了没有,如果正在初始化,会通过Thread.yield()让出CPU资源,如果么有初始化,会通过cas修改sizeCtl,判断数组初始化了没有,没有的话再次初始化数组

在这里插入图片描述

ConcurrentHashMap 扩容的流程

  1. 确认什么时候会触发扩容
  2. 触发扩容的时候,计算扩容标识戳
  3. 计算扩容标识戳的时候,会先往左诺16位+2代表是第一个进来扩容的线程
  4. 当线程扩容开始之后,要计算每个线程迁移数据的最小长度是多少,最小值是16
  5. 计算完扩容的长度之后,要初始化一个新的数组
  6. 初始化数组之后,领取任务,从xxx索引未知开始迁移,把老数组数据迁移到新数组之中
  7. 迁移完成之后,看是不是最后一个线程迁移完成的,如果是最后一个线程迁移完成的话,要从头到位检查一下有没有遗漏的数据

ConcurrentHashMap 读取数据的流程

  1. get方法是不会加锁的,查询时,第一步,基于Key得到hashcode值,再基于hashcode定位到索引的某一个未知,如果数组上存储的数据就是我要的,直接返回,如果数组上的数据不是我要的
  2. 我可能做两布查询
    第一种情况,查询双向链表,在链表中next查询,时间复杂度为oN
    另一种情况,如果数据做了迁移,下面是红黑树,那么会基于find方法做其他查询,如果数据已经迁移了,会直接查询新数据nexttable,在nexttable中查询
  3. 如果是红黑树,在红黑树里面,如果有写操作正在执行,或者有写操作正在等待,读操作会查询双向链表,如果没有写操作在执行,也没有写操作在等待
    就直接查询红黑树,以二分半的形式,以大O的logN的时间复杂度去查询需要的数据

ConcurrentHashMap addcount(计数器的实现)

  1. 类似与使用了longAdder实现了这部分功能,并发不高的情况下使用baseCount进行cas,并发高的时候使用CounterCell数组,对CounterCell中的value进行cas操作
  2. size()方法,用了countercell数组中的value和baseCoune相加返回的
  3. size()是弱一致性,不是强一致性

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

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

相关文章

人体工学椅真的很舒服

前言 人体工学椅是现代办公室中必不可少的家具之一。作为一款专门设计为舒适、健康和高效的椅子,它为人们提供了更好的工作和学习体验。 人体工学椅的设计理念是以人体工程学为基础,根据人体骨骼生理学、生物力学和心理学等多个角度进行科学的设计。它…

公路工程公路bim数据与GIS数据融合应用

摘要: BIM技术因其自身的协同性、可模拟性以及可视化优势,能够补足传统项目管理存在的短板,成为新一代项目管理模式。本文将运用BIM技术打造一体化管理平台,达到项目管理的智能化管理水平,实现更易维、更安全、更节能…

谈一谈数据库设计原则

到开发的时候才发现,原来后端不是最难的,最难得是数据库的设计,往往有时候开发新模块的时候才发现,之前数据库设计的一些问题,今天就来简单谈谈数据库设计方面的一些原则。 数据库范式 ​ 通过将数据结构分解成小的部…

第五十四章 Unity 移动平台输入(下)

本章节我们介绍一个模拟器插件。这种插件比较多,比如EasyTouch,Lean Touch,Joystick Pack等等。EasyTouch是一个使用非常广泛的插件,支持点击,拖拽,遥感等很多常用功能。不过遗憾的是,该插件已经…

[JAVA]直接插入排序

插入排序就像玩扑克牌一样,把元素按照大小插入到一个已经排好序的序列中,直到全部元素排好。 假设我们拿到了一个数组,请问我们该从哪一个元素开始着手于直接插入排序呢? 答案是:第二个元素 我们可以假设,第…

微服务测试如何测试?

本文将讨论微服务测试的重要性、挑战和最佳实践。 微服务架构是一种越来越流行的构建复杂分布式系统的方法。在此体系结构中,大型应用程序被分成较小的、独立的服务,这些服务通过网络相互通信。微服务测试是确保这些服务无缝协同工作的关键步骤。本文将…

《微服务实战》 第五章 Spring Cloud Netflix 之 Ribbon

前言 Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具,其主要功能是提供客户端的负载均衡算法和服务调用。 1、负载均衡 负载均衡(Load Balance) ,简单点说就是将用户的请求平摊分配到多个…

【论文阅读19】GloVe: Global Vectors for Word Representation

论文十问十答: Q1论文试图解决什么问题? Q2这是否是一个新的问题? Q3这篇文章要验证一个什么科学假设? Q4有哪些相关研究?如何归类?谁是这一课题在领域内值得关注的研究员? Q5论文中提到的解决方…

Packet Tracer - 使用 CLI 配置并验证站点间 IPsec VPN

Packet Tracer - 使用 CLI 配置并验证站点间 IPsec VPN 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 交换机端口 R1 G0/0 192.168.1.1 255.255.255.0 不适用 S1 F0/1 S0/0/0 (DCE) 10.1.1.2 255.255.255.252 不适用 不适用 R2 G0/0 192.168.2.1 255.…

Oracle数据库安装教程,并实现公网远程连接

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle,是甲骨文公司的一款关系…

黑客的真实生活是怎样的?他们真的能挣很多钱么?

作者:l浪费的时间 黑客这一群体,在普通人眼中就是神一般的存在。 黑客差钱吗?他们不差钱。当然是靠装逼活着,很多黑客只想钻研技术攻破个大公司玩玩,搞得轰轰烈烈,就能吹一辈子牛了。 一、黑客靠什么赚钱…

Nginx静态资源防盗链

1.什么是资源盗链 简单地说,就是将别人的资源用到自己的页面展示给用户。 2.效果演示 1)准备图片 这两张图片直接在浏览器中访问都是可以打开的。 github图片地址:https://github.githubassets.com/images/modules/site/home-campaign/her…

linux命令sort, uniq ,tr, cut,split,paste,eval

sort 以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序。比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。 语法格式: 格式1 sort [选项] 参数 格式2 cat file | sort 选顶选项含义-n按照数字进行排序…

MySQL8.0安装教程(很详细)

1.进入mysql官网 2.点击DOWNLOADS去下载页面,页面往下滚动,点击MySQL Community (GPL) Downloads 下载社区版 3.点击MySQL Installer for Windows–>选择window安装版 4.选择下面这一项,点击Download 5.点击No thanks, just start my down…

kali 装pwngdb报错版本不兼容

小白垃圾笔记而已,不建议阅读。 报错是这个: 安装pwndbg的时候报的错。 这个具体不知道啥原因,但是还好有师傅,其实这样装好后是可以用的,只是不兼容,可能有些功能会受限制。 师傅这样说: pwn…

权威报告:2030年企业将全面上云,隐私计算可保障数据上云安全可信

近日,国际权威机构Forrester发布了《亚太地区隐私保护技术(PPTs)现状》报告(简称“报告”)。报告显示,隐私保护技术在亚太地区发展强劲,76% 的决策者正在采用隐私计算来保护隐私和数据安全。For…

CMake的安装和使用

Windows平台 1. 下载CMake和MinGW,并安装。 (1)CMake下载和安装: 下载地址:Download | CMake 可以直接下载如下安装程序进行安装: 安装时注意,选择将cmake命令加入系统环境变量,…

python并发编程: Python速度慢的罪魁祸首,全局解释器锁GIL

python速度慢的两大原因 动态类型语言,边解释边执行 由于GIL,无法利用多核CPU并发执行 GIL是什么? 全局解释锁(Global Interpreter Lock,GIL)是计算机程序设计语言解释器用于同部线程的一种机制&#xff0c…

c#笔记-异常

异常 当一个程序遇到各种各样的问题而无法正常运行时,我们需要知道导致问题的原因, 并根据原因来解决问题。 一种常见的方式是程序给出一串错误码,然后开发人员查找对应的错误信息。 而在c#中,我们可以在程序内部就处理异常&am…

改进YOLOv8 | 即插即用篇 | 在 C2F 模块中添加 【SE】 【CBAM】【 ECA 】【CA 】注意力机制 | 附详细结构图

这篇教程是在你默认添加了《改进YOLOv8 | 即插即用篇 | 手把手教你 YOLOv8 添加注意力机制 | 适用于【检测任务】【分类任务】【分割任务】【关键点任务】| 20+ 种全打通!》的代码后进行的后续改进的补充。 1. SE 注意力模块 论文名称:《Squeeze-and-Excitation Networks》 …