Java基础之ConcurrentHashMap答非所问

news2024/11/13 9:30:49

ConcurrentHashMap的数据结构是什么?

        ConcurrentHashMap仅仅是HashMap的线程安全版本,针对HashMap的线程安全优化,所以HashMap有的特点ConcurrentHashMap同意具有, ConcurrentHashMap的数据结构跟HashMap是一样的。

        在JDK7版本使用数组+链表的结构。具体来说是使用了Segment数组 + HashEntry数组 + HashEntry链表,看起来就像是Segment数组 + HashMap的结构,线程安全精确到分段数组的每个节点。在保证Map线程安全的前提下,尽量提升吞吐量。

         在JDK8版本使用数组+链表/红黑树的结构。放弃了Segment数组和HashEntry数组。

 ConcurrentHashMap如何保证线程安全?

        JDK7版本是使用Segment将一个table数组分解成多个Segment数组,Segment又是由多个链表构成的。而put方法,会从头到尾再加上锁。

        1.8版本是使用synchronized关键字修饰具体执行数据插入的部分,这是跟Hashtable很大的不同,而且这个锁是加在table上的头节点上的,不影响。

同样是线程安全的HashMap,为什么ConcurrentHashMap要比HashTable效率高?

        HashTable的线程安全实现方式较为粗暴,采用了将所有的方法都使用synchronized关键字修饰,而ConcurrentHashMap的线程安全在JDK7版本是采用的分段锁的方式来实现的,在JDK8版本中是采用CAS + synchronized方式实现的。从这段描述中就能看出,HashTable的锁粒度都是方法级的,而ConcurrentHashMap的锁粒度更小。

既然ConcurrentHashMap那么好,为什么还需要HashTable?

        ConcurrentHashMap效率高是因为他牺牲了一定的安全性的基础上达到的。在执行扩容时,put会阻塞,而get会去获取老数据,这样就产生了数据不一致的问题。而这种情况HashTable是不会发生的,因为他是全表锁。

ConcurrentHashMap1.8版本的sizeCtl是干什么用的?

sizeCtl的作用是标注数组数组状态:

  • 0表明数组未初始化;
  • 负数且小于-1,表明此时有|N + 1|个线程正在对数组进行扩容;
  • 正数存在两种情况:在数组未初始化时,sizeCtl表明数组的初始容量;在数组已初始化时,sizeCtl表明数组的扩容阈值;
  • -1表明数组正在被初始化;

ConcurrentHashMap什么时候用链表,什么时候用红黑树?

        默认是用链表存储的。在table的长度大于64且Node链表长度大于等于8的时候会将链表转成红黑树。在红黑树节点数量小于等于6时,将红黑树转成链表。

为什么树化的阈值和链表化的阈值不同呢?

        大概是为了避免当节点长度处于7个的时候,增删节点造成反复转换存储结构吧。

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

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

相关文章

中学理化生实验室建设及配置要求

中学理化生实验室是中学阶段进行物理、化学、生物教学和研究的场所。其可以满足实验教学要求,实验室提供必要的仪器、设备、工具、材料等课程资源,方便学生熟悉并接触一些实验仪器设备,学习掌握基本实验技能。同时,实验室科学合理的方案配置&…

MySQL原理(十):主从架构

前言 上一篇介绍了 MySQL 的表分区和分库分表,这一篇将介绍主从架构相关的内容。 主从架构 常见的主从架构模式有四种: 一主多从架构:适用于读大于写的场景,采用多个从库来分担数据库系统的读压力。多主架构:适用于…

康希诺生物:新冠疫苗影响当期业绩,毛利润减少89.92%

来源;猛兽财经 作者:猛兽财经 猛兽财经获悉,由于4月28日,康希诺生物(06185)发布2023年一季度报告,收入同比下滑及利润端亏损,主要由于新冠疫苗需求量同比大幅下降,以及产品价格调整…

在 IDEA 中创建 Java Web 项目的方式(详细步骤教程)

开发环境 以下是我的开发环境 JDK 1.8Maven 3.6.3Tomcat 9.0IDEA 2019(2019 无所畏惧,即使现在已经 2023 年了哈哈哈) 最原始的 Java Web 项目 下面的内容可能会因 IDEA 版本不同,而有些选项不同,但是大同小异。 …

【上进小菜猪】使用Ambari提高Hadoop集群管理和开发效率:提高大数据应用部署和管理效率的利器

📬📬我是上进小菜猪,沈工大软件工程专业,爱好敲代码,持续输出干货,欢迎关注。 介绍 Hadoop是一种开源的分布式处理框架,用于在一组低成本硬件的集群上存储和处理大规模数据集。Ambari是一种基…

python 获取cookie的方法

在 Web应用程序中,用户访问网站时,通常会请求访问服务器上保存的一些用户信息(例如: Cookie),这些信息包含了用户的一些个人信息,比如:姓名、地址、密码等。对于用户来说&#xff0c…

目标检测YOLO实战应用案例100讲-基于YOLOv3的目标检测研究及改进(论文篇)

知识拓展 多尺度特征学习 目前深度学习用于目标检测已经习以为常。从SSD到Yolo系列,其中: 深层网络的感受野比较大,语义信息表征能力强,但是特征图的分辨率低,几何信息的表征能力弱(空间几何特征细节缺乏); 低层网络的感受野比较小,几何细节信息表征能力强,虽然分辨…

国漫画江湖之不良人6真的封神!

国漫画江湖之不良人6真的封神! 今天不良人第六季大结局,真的超好看,不仅剧情完整,而且还非常甜,看的非常爽,时长直接拉到40分钟,打斗场面刺激,简直是语言形容不出来的爽&#xff01…

[PyTorch]Onnx模型格式的转换与应用

相较于PyTorch默认的模型存储格式pth而言,onnx具有多端通用,方便部署的优点(据称能加快推理速度,但是未验证),本文将介绍如何使用onnx并将原有的pth权重转换为onnx。 一、配置环境 在控制台中使用如下指令 …

【wordpress】管理员忘记密码? 三种方法找回

随着近年来网络攻击日趋频繁,我们在网站中所设置的各种密码也变得越来越复杂,wordpress现在也可以生成非常复杂的密码,以防止被暴力破解。 但这些复杂的密码一般是无法记住的,我们会将此存放在我们的记事本中 如果我们的记事本遗…

Linux--install and uninstall app

1. deb系列(Ubuntu为例) 1.2 mysql 参考链接 1.2.1 Install 1.2.1.1 方法一 #1.更新仓库 sudo apt update #2.安装库中mysql版本 sudo apt install mysql-server -y1.2.1.2 方法二 mysql官网下载 #1.下载指定版本 #2.装载该版本至系统仓库 sudo …

【加解密篇】利用HashCat破解RAR压缩包加密文件详细教程

【加解密篇】利用HashCat破解RAR压缩包加密文件详细教程 在取证知识里挖呀挖呀挖—【蘇小沐】 文章目录 【加解密篇】利用HashCat破解RAR压缩包加密文件详细教程1.实验环境2.RAR加密压缩包 (一)john软件1.使用CMD命令: run\rar2john.exe &am…

WGCNA | 不止一个组的WGCNA怎么分析嘞!?~(二)(共识网络分析-第二步-构建网络与模块-一步法)

1写在前面 最近遇到了非常不讲理的病人和家属,真是忍不住想要吐槽两句。😤 为了让病人做上手术,求了输血科半天才给备了血,家属也答应去献血。😒 万万没想到,术后都2天了还是没去献血,无论是问病…

达索系统助力中车制造运营管理(MOM)平台建设

案例背景: 中国中车股份有限公司(中文简称“中国中车”,英文简称缩写“CRRC”)承继了中国北车股份有限公司、中国南车股份有限公司的全部业务和资产,是全球规模领先、品种齐全、技术一流的轨道交通装备供应商。 中国…

MySQL---10、详细的数据类型

1、MySQL中的数据类型 类型类型举例整数类型TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT浮点类型FLOAT、DOUBLE定点数类型DECIMAL位类型BIT日期时间类型YEAR、TIME、DATE、DATETIME、TIMESTAMP文本字符串类型CHAR、VACHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT枚…

Java设计模式-装饰模式

简介 装饰模式在Java领域是一种常见的设计模式,它能够在不改变对象原有结构的情况下,动态地为对象添加新的功能。它通过封装原有对象,在运行时动态地为对象添加新的行为或者修改原有行为,以扩展对象的功能。这种方式避免了继承的…

C语言:简单的三子棋游戏

谈到三子棋,想必大家都不陌生,童年的回忆呀,读小学的时候有事没事就和同学玩上个几把,玩起来很得劲,作为一个学习计算机的博主,自然而然用代码来实现三子棋啦,再次感受童年的记忆,闲…

yolov8 实例分割 C++部署

此处仅为个人结果记录,并无完整部署代码 目录 Pre 一、OpenCV DNN C 部署 二、ONNX RUNTIME C 部署 Pre 一定要知道,yolov8的输出与Yolov5 7.0 实例分割的输出不一样, output0: float32[1,116,8400]。 116是4个box坐标信息80个类别概率…

政务场景|看「API-SMAC」如何守好API,保障流动数据安全

API让一切都变得更加容易。 在数字化进程加速中,API作为高速通道,让数据的流动变得更加自由。当然,黑客也这么认为。从前窃取数据需要攻入内网,再经过一系列复杂的横向移动最终访问目标数据库,极易被安全设备拦截。现在…

endNote X9 增加 / 删除参考文献 文献编号自动更新

文章目录 1 增插参考文献2 删减参考文献3 EndNote X9 插入参考文献常见问题总结4 EndNote X9 快速上手教程(毕业论文参考文献管理器) 1 增插参考文献 当前已经插入5个文献,文献编号及附录列表如下 例如在,2和3之间新插入文献 “邱…