ConcurrentHashMap和HashMap的区别

news2024/10/5 13:38:37

HashMap相关知识点见主页博客:HashMap散列表的相关知识点-CSDN博客

目录

1、ConcurrentHashMap

2、ConcurrentHashMap和HashMap的区别


1、ConcurrentHashMap

ConcurrentHashMap 是 Java 中的一个线程安全的哈希表实现,它是java.util.Map接口的一个具体实现类。它是为了在多线程环境下提供高并发性能而设计的。它提供了更好的写并发能力,并降低了对读一致性的要求。

ConcurrentHashMap 的实现原理如下:

1.1 ConcurrentHashMap 使用了数组+链表+红黑树的数据结构来存储键值对。数组的每个元素称为桶(bucket),每个桶可以存储多个键值对。

1.2 ConcurrentHashMap 使用哈希算法来确定键值对在数组中的位置。当插入或查找键值对时,首先根据键的哈希值计算出数组中的索引,然后在该索引处的桶中进行操作。

1.3 当多个线程同时访问 ConcurrentHashMap 时,每个线程会被分配到不同的段(segment)上。每个段相当于一个独立的小的哈希表,它们之间没有锁竞争。这样可以提高并发性能。

图片来源:ConcurrentHashMap实现原理-CSDN博客

1.4 在 JDK 1.7 中,ConcurrentHashMap 使用了分段锁(segment lock)来保证线程安全。每个段都有自己的锁,不同的线程可以同时访问不同的段,从而提高并发性能。

1.5 在 JDK 1.8 中,ConcurrentHashMap 的实现参考了 HashMap 的实现,采用了数组+链表+红黑树的方式,并且使用了 CAS (Compare and Swap) 操作来保证线程安全。这样可以减少锁的粒度,提高并发性能。

1.6 当多个线程同时修改 ConcurrentHashMap 时,会根据需要对桶进行扩容或者收缩,以保证并发性能和空间利用率。

ConcurrentHashMap默认容器大小(initial capacity)是16,这是指在创建ConcurrentHashMap对象时,如果没有显式指定容器的初始容量,它将使用默认值16。当然,在实际使用中,可以通过构造函数或方法来指定初始容量。

ConcurrentHashMap的部分源码:

ConcurrentHashMap在内部采用了分段锁(Segment),将整个哈希表分成了多个片段,每个片段都有一个独立的锁,不同的线程可以同时对不同的片段进行操作,从而提高并发性能。这个分段锁的数量是可以通过构造函数中的concurrencyLevel参数来指定的,默认值为16。并且内部采用了分段锁来提供高并发性能。

ConcurrentHashMap的部分源码:

2、ConcurrentHashMap和HashMap的区别

ConcurrentHashMapHashMap是Java中的两个常见的哈希Map实现类,它们有以下区别:

1. 数据结构:HashMap 和 ConcurrentHashMap 都是基于哈希表实现的,但ConcurrentHashMap 采用了分段锁技术,将整个哈希表分成了多个小的哈希表,每个小的哈希表都有自己的锁,这样在多线程环境下,只要不是同一个小的哈希表,就可以实现并发访问,从而提高了并发性能。

2. 线程安全性HashMap 是非线程安全的,而 ConcurrentHashMap 是线程安全的。HashMap 的 key 和 value 都可以为 null,而 ConcurrentHashMap 的 key 和 value 都不能为 null。ConcurrentHashMap是线程安全的,支持多线程并发访问。相比之下,HashMap不是线程安全的,如果在多线程环境下需要使用,需要进行额外的同步处理。

3. 迭代器ConcurrentHashMap的迭代器是弱一致(weakly consistent)的,即迭代器遍历时可能会看到一部分已经完成修改但是还未被同步到主存中的元素,或者看不到已经完成修改但是还未被同步到主存中的元素。相比之下,HashMap的迭代器是快速失败(fail-fast)的,即如果在迭代过程中发现集合被修改了,则抛出ConcurrentModificationException异常。

4. 扩容机制ConcurrentHashMap的扩容操作可以支持多线程并发执行,而且不会出现数据丢失或者死锁等问题。相比之下,HashMap的扩容操作需要在单线程环境下进行,因为在扩容期间如果进行并发的插入或删除操作可能会导致数据结构被破坏。

5. 性能:由于 ConcurrentHashMap 采用了分段锁技术,特别是在多线程环境下的并发读写的场景下,ConcurrentHashMap的性能比HashMap要好很多。但是在单线程环境下,HashMap的性能可能会更好,因为它不需要考虑并发问题。

综上所述,如果需要在多线程环境下使用Map数据结构,并且对性能有一定的要求,推荐使用ConcurrentHashMap。如果在单线程环境下使用,或者对并发性能要求不高,可以使用HashMap

参考:

【精选】ConcurrentHashMap 实现原理_盛夏温暖流年的博客-CSDN博客

ConcurrentHashMap实现原理-CSDN博客

Hashmap和ConcurrentHashmap的区别_concurrenthashmap和hashmap区别-CSDN博客

HashMap与ConcurrentHashMap的区别-CSDN博客


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

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

相关文章

负载均衡Ribbon和Feign的使用与区别

Ribbon 的介绍 Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具。主要功能是提供客户端的软件负载均衡和服务调用。Ribbon 客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer…

【python】Python生成GIF动图,多张图片转动态图,pillow

pip install pillow 示例代码: from PIL import Image, ImageSequence# 图片文件名列表 image_files [car.png, detected_map.png, base64_image_out.png]# 打开图片 images [Image.open(filename) for filename in image_files]# 设置输出 GIF 文件名 output_g…

深入理解JSON及其在Java中的应用

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:每天一个知识点 ✨特色专栏&#xff1a…

【docker】虚拟化和docker容器概念

基础了解 IAAS: 基础设施服务,(只提供基础设施,没有系统) **SAAS: ** 软件即服务,(提供基础设施和系统) PAAS: 平台即服务,(提供基…

哪个才是最适合你的 Web UI 自动化测试框架

最近,项目上出于系统性稳定性、减少测试工作量考虑,打算在 Web 前端引入 BDD。由于上一个项目写了一定的 Cucumber 代码(BDD 测试框架之一),这个框架选型的责任便落到了我的肩膀上了。 在我们进行框架选型的时候&#…

前端uniapp生成海报绘制canvas画布并且保存到相册【实战/带源码/最新】

目录 插件市场效果如下图注意使用my-share.vue插件文件如下图片hch-posterutilsindex.js draw-demo.vuehch-poster.vue 最后 插件市场 插件市场 效果如下图 注意 主要&#xff1a;使用my-share.vue和绘制canvas的hch-poster.vue这两个使用 使用my-share.vue <template&…

使用kafka_exporter监控Kafka

prometheus 监控 kafka 常见的有两种开源方案,一种是传统的部署 exporter 的方式,一种是通过 jmx 配置监控, 项目地址: kafka_exporter:https://github.com/danielqsj/kafka_exporterjmx_exporter:https://github.com/prometheus/jmx_exporter本文将采用kafka_exporter方…

win11,无法修改文件的只读属性,解决办法

在尝试更改文件或文件夹的权限时&#xff0c;您可能经常会遇到错误 - 无法枚举容器中的对象访问被拒绝。 虽然作为管理员&#xff0c;您可以更改访问权限&#xff0c;但有时即使是管理员也可能会遇到相同的错误消息。 这是一个常见错误&#xff0c;通常由不同论坛上的用户提出…

Web前端—移动Web第三天(移动Web基础、rem、less、综合案例—极速问诊)

版本说明 当前版本号[20231120]。 版本修改说明20231120初版 目录 文章目录 版本说明目录移动 Web 第三天01-移动 Web 基础谷歌模拟器屏幕分辨率视口二倍图适配方案 02-rem简介媒体查询rem 布局flexible.jsrem 移动适配 03-less注释运算嵌套变量导入导出禁止导出 04-综合案例…

【SA8295P 源码分析 (三)】132 - GMSL2 协议分析 之 GPIO/SPI/I2C/UART 等通迅控制协议带宽消耗计算

【SA8295P 源码分析】132 - GMSL2 协议分析 之 GPIO/SPI/I2C/UART 等通迅控制协议带宽消耗计算 一、GPIO 透传带宽消耗计算二、SPI 通迅带宽消耗计算三、I2C 通迅带宽消耗计算四、UART 通迅带宽消耗计算系列文章汇总见:《【SA8295P 源码分析 (三)】Camera 模块 文章链接汇总 -…

nvm管理node版本过程记录

写在前面 今天记录一下windows电脑安装nvm同时使用nvm管理node版本的&#xff0c;为什么写windows版本的呢&#xff1f;因为mac版本的基本上是不需要进行记录的&#xff0c;相对windows的安装是简单很多的&#xff0c;行了废话不多说&#xff0c;我们直接开始 安装nvm nvm下载…

日志技术logback

一&#xff0c;日志概括 二&#xff0c;日志技术的特点 三&#xff0c;日志技术的体系 三&#xff0c;入门 四&#xff0c;案例 package XinZheng;import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class Main58 {//1,创建一个Logger日志对象public static fi…

PIL如何批量给图片添加文字水印?

PIL如何批量给图片添加文字水印&#xff1f; 1 简单引入2 关于PIL3 本文涉及的PIL的几个类4 实现原理5 实现过程5.1 原始图片5.2 导入相关模块5.3 初始化数据5.4 水印字体设置5.5 打开原始图片并新建存储对象5.6 计算图片和水印的大小5.7 选择性设置水印文字5.8 绘制文字并设置…

Vite - 配置 - 自动修改 index.html 中的title

需求描述 在Vue3项目的开发过程中&#xff0c;我们为了能区分正式环境和测试环境&#xff0c; 通常会进行环境配置文件的区分&#xff0c; 例如&#xff0c;开发环境一个配置文件、生产环境一个配置文件。因此&#xff0c;我们就希望 在项目的index.html 的 title 标签中&…

普冉PY32系列(十) 基于PY32F002A的6+1通道遥控小车I - 综述篇

目录 普冉PY32系列(一) PY32F0系列32位Cortex M0 MCU简介普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单普冉PY32系列(四) PY32F002A/003/030的时钟设置普冉PY32系列(五) 使用JLink RTT代替串口输出日志普冉PY32…

Redis从入门到精通(三)-高阶篇

文章目录 0. 前言[【高阶篇】3.1 Redis协议(RESP )详解](https://blog.csdn.net/wangshuai6707/article/details/132742584)[【高阶篇】3.3 Redis之底层数据结构简单动态字符串(SDS)详解](https://blog.csdn.net/wangshuai6707/article/details/131101404)[【高阶篇】3.4 Redis…

GNSS技术在农业领域的创新应用

全球导航卫星系统&#xff08;GNSS&#xff09;技术在农业领域的广泛应用为现代农业带来了革命性的变革。从精准农业到农业机械自动化&#xff0c;GNSS技术为提高农业生产效率、减少资源浪费、实现可持续发展提供了关键支持。本文将深入探讨GNSS技术在农业领域的应用&#xff0…

【理解ARM架构】不同方式点灯 | ARM架构简介 | 常见汇编指令 | C与汇编

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《理解ARM架构》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f3c0;直接操作寄存器点亮LED灯&#x1f3c0;地址空间&#x1f3c0;ARM内部的寄存…

深度学习入门:自建数据集完成花鸟二分类任务

自建数据集完成二分类任务&#xff08;参考文章&#xff09; 1 图片预处理 1 .1 统一图片格式 找到的图片需要首先做相同尺寸的裁剪&#xff0c;归一化&#xff0c;否则会因为图片大小不同报错 RuntimeError: stack expects each tensor to be equal size, but got [3, 667…

5.基于飞蛾扑火算法(MFO)优化的VMD参数(MFO-VMD)

代码的使用说明 基于飞蛾扑火算法优化的VMD参数 优化算法代码原理 飞蛾扑火优化算法&#xff08;Moth-Flame Optimization&#xff0c;MFO&#xff09;是一种新型元启发式优化算法&#xff0c;该算法是受飞蛾围绕火焰飞行启发而提出的&#xff0c;具有搜索速度快、寻优能力强的…