HashMap, HashTable, ConcurrentHashMap 之间的区别

目录

  • 关于线程安全
  • HashTable 和 ConcurrentHashMap 的区别
    • 1. ==加锁粒度不同==(最关键 最核心的区别!!!)
    • 2. ConcurrentHashMap 利用了 CAS 机制 (无锁编程)
    • 3. 优化了扩容策略

关于线程安全

我们知道 HashMap 是线程不安全的.
如果要在多线程环境下使用哈希表, 则可以使用:HashTable ConcurrentHashMap.
HashTable 是给关键方法加上锁, 给方法加锁就相当于针对 this 加锁.

HashTable 和 ConcurrentHashMap 的区别

1. 加锁粒度不同(最关键 最核心的区别!!!)

什么是锁粒度呢?

就是 synchronized 代码块所含代码的多少.(代码越多 粒度越粗, 代码越少 粒度越细)

引申: 锁粗化

写代码时, 一般情况下, 我们希望锁的粒度小一点更好.(串行执行的代码少, 并发执行的代码多)
如果某个场景要频繁加锁和解锁, 此时编译器就可能把这几个加锁解锁操作优化成一个更粗粒度的锁.(每次加锁解锁都会有开销, 特别是释放完锁后重新加锁, 这时就要重新进行锁竞争)

为什么加锁粒度不同呢?
HashTable 是针对整个哈希表加锁, 任何的增删改查操作都会触发加锁, 也就都可能触发锁竞争.

我们知道哈希表是一个数组, 每个数组元素都是一条链表, 当链表达到一定长度后, 链表就会被替换为红黑树.
在这里插入图片描述
这样加锁固然能使其线程安全, 但它的效率就大大降低了.

假设一个这样的场景, 我们同时对每条链表都进行一次修改, 显然这些修改不会相互影响, 但会引发锁冲突, 导致阻塞等待, 使代码执行效率大大降低.

竟然如此, 那我们可以多加几把锁, 将每条链表都加上不同的锁, 这样对不同的链表进行操作就不会产生阻塞等待了, 大大提到代码效率. 这便是ConcurrentHashMap 的加锁方式.
在这里插入图片描述
它是如何实现每个链表都加上不同的锁呢?
针对每个操作, 我们都在获取到头节点后, 将链表的头节点放入 synchronized 中, 因为每个头节点都不同, 所以每把锁的锁对象都不同, 极大的降低了锁冲突.

给每个链表加锁是从 Java8 开始的, 在 Java1.7 之前 ConcurrentHashMap 是使用 “分段锁”, 什么是分段锁呢? 其实就是好几个链表共用一把锁.(“分段锁” 效率不高, 代码写起来也麻烦)

2. ConcurrentHashMap 利用了 CAS 机制 (无锁编程)

有些操作可以直接使用 CAS 完成, 比如获取/更新元素个数.
CAS 也能保证线程安全, 往往比锁更高效, 但是适用范围没有锁广泛.

3. 优化了扩容策略

对于 HashTable, 如果元素太多了, 就会涉及到扩容, 根据负载因子来决定是否扩容, 扩容就要重新申请一段内存空间, 把数组元素从旧哈希表上删除, 添加到新哈希表上.
如果哈希表上元素有很多 都上亿了, 那么搬运一次的成本将非常高, 导致 put 操作将非常卡顿.

对于 ConcurrentHashMap 它的搬运策略是 化整为零.
当 put 触发了触发扩容, 此时就会申请一块更大的内存空间, 但并不会一次就把元素搬运完, 而是搬运一部分(每次对哈希表进行操作时, 都搬运一小部分).此时就会有两个哈希表, 这时添加新元素时, 就是往新表插入;
删除, 查找, 修改元素时 就是对新旧两个表进行查找, 再进行操作.
(虽然相比 HashTable 多了浪费了一块空间, 但为了效率还是值得的)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习语义分割篇——FCN原理详解篇

🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题 🍊往期回顾:目标检测系列——开山之作RCNN原理详解    目标检测系列——Fast R-CNN原理详解    目标检测系列——Faster R-CNN原理详解 🍊近期目标&…

说微软翻译比谷歌准,有人不信,就拿雾霾造了个句子

导读近年来,谷歌(微博)、微软、亚马逊和Facebook等硅谷巨头在人工智能(AI)领域进行着军备竞赛。在应用层面,有的开发智能管家、有的做机器人、有的训练AI治疗疾病。谷歌和微软则在翻译领域较上了劲。 长久以来,谷歌翻译…

Redis Stream消息并发和未ack消息处理

文章目录1. RedisStreamConfig2. 消费者MyMessageListener3. RedisStreamUtil4. RedisStreamConstant5. 测试6. 处理消费者已读取未ack的消息redis stream文档参考 https://zhuanlan.zhihu.com/p/60501638 1. RedisStreamConfig package com.tophant.eventdemo.common.config…

CSS3笔试题精讲1

防止父元素高度坍塌 4种方案 父元素的高度都是由内部未浮动子元素的高度撑起的。 如果子元素浮动起来,就不占用普通文档流的位置。父元素高度就会失去支撑,也称为高度坍塌。 即使有部分元素留在普通文档流布局中支撑着父元素,如果浮动 起来的元素高度高于留下的素。那么浮…

MySQL日志管理、备份与恢复

文章目录一.MySQL 日志管理1、错误日志2、通用查询日志3、二进制日志4、慢查询日志5、查看日志6、实例操作二、数据库备份的重要性与分类1、数据备份的重要性2、从物理与逻辑的角度,备份分为:3、从数据库的备份策略角度,备份可分为&#xff1…

Spring Cloud Sentinel实战(四)-流控规则-关联、预热、排队等待

流控规则-关联 名词解释 资源名:唯一名称,默认请求路径针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)阈值类型/单机阈值: QPS(每秒钟…

常见问题自助服务,你做对了吗?

一遍又一遍地回答重复的问题可能会成为客户支持团队的一项令人恼火的任务。当您的业务不断增长时,这些问题的数量可能会让您的座席不知所措。但是,如果您为客户设置一个常见问题自助回复服务,会大大减少这一工作量,提高客户体验&a…

安装部署skywalking8.2

SkyWalking是一个开源的分布式系统跟踪解决方案,它提供了分布式系统的性能监控、调用链追踪、度量分析和服务网格等功能。SkyWalking能够帮助开发人员快速定位分布式系统的性能问题,提高系统的可靠性和可扩展性。 SkyWalking支持多种语言和框架&#xff…

【linux】常用指令大全

这篇文章涵盖了linux中常用的所有指令,欢迎大家阅读查询。(如有不正确的地方,各位大佬可以在评论区指出,我会及时进行更正)。 文章目录登录远程服务器ssh添加删除用户当前路径pwd列出文件目录ls进入cdtreewhoami创建文件touch创建目录mkdir删…

java 高考志愿填报系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 高考志愿填报系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0…

发现一个白嫖GPT4.0的方法!真的是完胜3.5!

大家好,我是五竹。 先说个基本的科普,最近被问的人都嘛了。 1、ChatGPT账号只有两种:普通账号和plus账号。 2、普通账号升级到plus账号,需要绑定国外的支付方式,每个月大概130左右!plus账号更稳!更快&am…

rk3568 音频调节音量-rk809

rk3568 音频调节音量-rk809 daisy使用的是rk3568的主板,系统使用的是v2版本的,使用正常-6dB的音频的文件和耳机声道输出听不清楚,但是使用0dB的能听清楚,所以先从软件上下手修改音量配置,从默认的3改到了0,…

骨传导蓝牙耳机排行榜10强,盘点几款性能高的骨传导耳机

骨传导耳机是一种新型的耳机,它将声音转化为不同频率的机械振动,通过人的颅骨、骨迷路、内耳淋巴液、螺旋器、听觉中枢来传递声波。不需要通过耳道,是一种耳挂式的无线耳机。 骨传导耳机与普通耳机相比,最大的优势是不需要入耳&am…

【Linux系统编程】静态库和共享库

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:Linux系统编程 📣专栏定位:整理一下 C 相关的知识点,供大家学习参考~ ❤️如果有收获的话,欢迎点赞&#x1f…

CMD中dos命令

1 Ctrl R 2 有关某个命令的详细信息,请键入 HELP 命令名 ASSOC 显示或修改文件扩展名关联。 ATTRIB 显示或更改文件属性。 BREAK 设置或清除扩展式 CTRL C 检查。 BCDEDIT 设置启动数据库中的属性以控制启动加载。 CACLS 显示或修改文件的访问控制列表(ACL)。 CA…

第十一届“泰迪杯”数据挖掘挑战赛第四场赛前指导直播预告

为推广我国高校数据挖掘实践教学,培养学生数据挖掘的应用和创新能力,增加校企交流合作和信息共享,提升我国高校的教学质量和企业的竞争能力,第十一届“泰迪杯”数据挖掘挑战赛(以下简称挑战赛)已于2023年3月…

【MySQL】一文彻底搞懂 Redo-log 为什么要两阶段提交?

【MySQL】一文彻底搞懂 Redo-log 为什么要两阶段提交? 文章目录【MySQL】一文彻底搞懂 Redo-log 为什么要两阶段提交?两阶段提交的过程是怎样的?为什么需要两阶段提交?两阶段提交有什么问题?事务提交的方式——组提交两…

day1 计算机组成与结构考点汇总

一、重点知识点 计算机硬件组成、运算器、控制器奇偶校验码、循环冗余校验码、海明码指令系统:指令操作数寻址方式、CISC和RISC、指令流水线的计算存储系统:分级存储、局部性原理、cache、主存编址计算、磁盘输入输出技术:程序查询方式、中断…

解构同为科技(TOWE)工业连接器的配置和应用

如今,在各行各业作业生产中,都能看到工业连接器、插头插座的身影,它能够传输高速、高容量和高精度的信号和电力,具有防水、防尘、抗震动、抗干扰等特性,被广泛应用在工业控制、通讯、医疗、交通、航空、军事等领域&…

OTA(Over-the-air programming)是什么?

OTA(Over the air-programming)是什么? ‒ 是指将新软件,固件,设置,加密密钥更新无线发布到手机,机顶盒等设备的方式。 ‒ 对于固件而言,由于安装在诸如ROM,EPROM和flash memory等的…