线程安全的哈希表ConcurrentHashMap

news2024/12/24 9:35:23

1. HashTable

不推荐使用,无脑给各种方法加锁

2.ConcurrentHashMap

多线程下推荐使用

  1. 锁粒度控制

HashTable直接在方法上加synchronized,相当于对哈希表对象加锁,一个哈希表只有一把锁。多线程环境下,无论线程如何操作哈希表,都会产生锁冲突。
image.png
而ConcurrentHashMap每个哈希桶都有自己的锁,哈希表中哈希桶数量很多,大大降低了锁冲突的概率,性能也大大提升。
image.png

  1. ConcurrentHashMap只对写加锁,读操作不加锁

也就是说两个线程同时修改,才会有锁冲突;两个线程都读,没有锁冲突;一个线程写,一个线程读,也没有锁冲突。
为什么一个线程读一个线程写没有锁冲突?
难道不会读到修改一半的数据吗?ConcurrentHashMap在设计的时候,考虑到这个问题,所以保证在读的时候一定是读到一整数据(要么是旧版本,要么是新版本,不会是读到一半的数据)。
并且读操作也广泛使用volatile保证读到的数据是及时的。

  1. 充分利用CAS特性

像维护元素个数就是通过CAS实现,而不是加锁;以及使用CAS实现轻量级锁/自旋锁等等。

  1. 对扩容进行特殊处理

HashTable的扩容:当put元素时,发现负载因子超过阈值就触发扩容,申请一个更大的数组,把原来旧的数据搬运到新的数组上。
上述扩容方式存在很大问题,当元素个数特别多的时候,搬运操作就会开销非常大。put操作不需要扩容时瞬间完成O(1),但是触发扩容时就可能卡很久。
ConcurrentHashMap的扩容的时候,旧的数组和新的数组是同时存在的,每次进行哈希表操作都会把旧数组上的元素搬运一部分到新数组上,直到全部搬运完,再释放旧的空间。在这个过程中如果要查询元素,旧的数组和新的数组一起查;如果要插入元素,直接往新数组上插入;如果是删除元素,直接删除不用搬运。

  1. 面试题:HashMap,HashTable,ConcurrentHahMap的区别?

先说HashMap是线程不安全的,HashTable,ConcurrentHashMap是线程安全的。
再谈ConcurrentHashMap的优化

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

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

相关文章

医疗设备智慧管理助力医院提质增效,阿基米德amp;健康界实践分享

近日,苏州阿基米德网络科技有限公司与医疗领域头部级媒体健康界,联合举办“数智为擎 提质增效——医学装备智慧管理创新发展论坛”的直播活动。 直播现场,来自上海交通大学医学院附属同仁医院、中华医学会航海医学分会、苏州阿基米德的专家们…

循序字符中插入数据(链表)

有一串已经从小到大排好序的数 2 3 5 8 9 10 18 26 32。现需要往这串数中插入 6 使其得 到的新序列仍符合从小到大排列。(使用链表)

Python:核心知识点整理大全14-笔记

目录 ​编辑 7.2.2 让用户选择何时退出 parrot.py 7.2.3 使用标志 7.2.4 使用 break 退出循环 cities.py 7.2.5 在循环中使用 continue counting.py 7.2.6 避免无限循环 counting.py 7.3 使用 while 循环来处理列表和字典 7.3.1 在列表之间移动元素 confirmed_user…

查询mysql服务器当前时区设置、session当前时区设置

使用命令SELECT global.time_zone;可以查询mysql服务器的当前时区设置,例如: 使用命令SELECT session.time_zone;可以查询session的当前时区设置,例如:

2023年全国职业院校技能大赛信息安全管理与评估赛项正式赛(模块一)GZ032

全国职业院校技能大赛高等职业教育组 信息安全管理与评估 任务书 模块一 网络平台搭建与设备安全防护 极安云科专注技能竞赛,包含网络建设与运维和信息安全管理与评估两大赛项,及各大CTF,基于两大赛项提供全面的系统性培训,拥…

Linux常用命令---- test 命令

文章目录 基本语法文件测试检查文件是否存在检查文件是否是目录检查文件是否为空检查文件是否可读、可写或可执行 字符串测试检查字符串是否为空检查字符串是否相等检查字符串是否不相等 数字测试检查数字是否相等检查数字是否大于或小于 在Linux操作系统中,test命令…

59.计算机网络笔记

以上仅供参考,不一定对的,毕竟网络又不是我的学习方向。 一、路由器、交换机、网关。 交换机只会关心数据包的mac地址,不关心数据包的ip地址。 tcp/ip协议规定,不同子网之间是不可以直接通信的,如果要通信需要通过网关…

手动搭建koa+ts项目框架(日志篇)

文章目录 前言一、安装koa-logger二、引入koa-logger并使用总结如有启发,可点赞收藏哟~ 前言 本文基于手动搭建koats项目框架(路由篇)新增日志记录 一、安装koa-logger npm i -S koa-onerror and npm i -D types/koa-logger二、引入koa-lo…

大数据可视化推荐项目——基于Python/Django的电影评论可视化分析推荐系统的设计与实现

大数据可视化推荐项目——基于Python/Django的电影评论可视化分析推荐系统的设计与实现 技术栈:大数据爬虫/机器学习算法/数据分析与挖掘/大数据echarts可视化/Django框架/Mysql 摘要:本文介绍了一个基于大数据可视化的电影评论分析推荐系统&#xff0…

Clickhouse RoaringBitmap

https://blog.csdn.net/penriver/article/details/119736050 https://juejin.cn/post/7179956435806076988 BitMap适合连续密集的正整数存储,对于稀疏的正整数存储,其性能在很多时候是没办法和int数组相比的,尤其是正整数跨度较大的场景&…

python:五种算法(GWO、HHO、WOA、PSO、SSA)求解23个测试函数(python代码)

一、五种算法简介 1、灰狼优化算法GWO 2、哈里斯鹰优化算法HHO 3、鲸鱼优化算法WOA 4、粒子群优化算法PSO 5、麻雀搜索算法SSA 二、5种算法求解23个函数 (1)23个函数简介 参考文献: [1] Yao X, Liu Y, Lin G M. Evolutionary program…

k8s pod日志写入ELK的具体实现

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 在上一部分,shigen讲到了k8spod的日志写入ELK的三种技术方案,并在最后展示了一下我…

【vtkWidgetRepresentation】第九期 vtkAffineRepresentation2D仿射变换

很高兴在雪易的CSDN遇见你 【vtkWidgetRepresentation】第九期 vtk中的仿射变换 前言 本文分享VTK中的仿射变换,实际结果如下图所示,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞关注,小易会继续努力分享,一起进…

数电实验-----74LS192芯片实现任意进制计数器的功能(Quartus II )

目录 一、74LS192芯片介绍 管脚图 ​编辑逻辑图与功能表 工作原理 二、任意进制计数器的实现 1.复位清零法 2.外部反馈置数法 一、74LS192芯片介绍 74LS192是一种二进制同步上升计数器芯片,可以用于数字计数和时序控制等应用。它是TTL逻辑家族中的一员&#x…

文心一言 VS 讯飞星火 VS chatgpt (154)-- 算法导论12.3 1题

一、用go语言,给出 TREE-INSERT 过程的一个递归版本。 文心一言,代码不能运行: 下面是用 Go 语言实现一个递归版本的 TREE-INSERT 过程的代码: package main import "fmt" type TreeNode struct { Val int Lef…

tiktok/抖音x-bogus参数分析

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 这里只是我分析的分析过程,以及一些重要点的记录…

web服务器之——www服务器的基本配置

目录 一、www简介 1、什么是www 2、www所用的协议 3、WEB服务器 4、主要数据 5、浏览器 二、 网址及HTTP简介 1、HTTP协议请求的工作流程 三、www服务器的类型(静态网站(HTML), 动态网站(jsp python,php,perl)) 1、 仅提供…

windows10安装MongoDB的入门简易教程【学习自用】

一、下载安装包 下载地址 https://www.mongodb.com/try/download/community 因为我是在windows上安装,所以下载windows版本的压缩包格式 二、下载后解压到要安装的目录里去 我这里在D盘装,所以就解压到D盘中我自己建的的mongoDB文件夹中。 三、在解…

初识人工智能,一文读懂贝叶斯优化的知识文集(6)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

构建智能外卖跑腿小程序:技术实践与代码示例

在快节奏的现代生活中,外卖跑腿服务已成为人们日常生活中不可或缺的一部分。为了提供更智能、高效的外卖跑腿体验,本文将深入探讨构建一款智能外卖跑腿小程序所需的关键技术,并提供相应的代码示例。 1. 地理位置服务的整合 外卖跑腿小程序…