当前位置: 首页 > news >正文

【多线程】多线程(12):多线程环境下使用哈希表

【多线程环境下使用哈希表(重点掌握)】

可以使用类:“ConcurrentHashMap”

★ConcurrentHashMap对比HashMap和Hashtable的优化点

1.优化了锁的粒度【最核心】

//Hashtable的加锁,就是直接给put,get等方法加上synchronized,就是给this加锁,整个哈希表对象就是一把锁,任何一个针对这个哈希表的操作都会触发锁竞争

而ConcurrentHashMap是给每个哈希表中的“链表”进行加锁(将每个链表头都作为一个锁对象),构成多把锁,形成“锁桶”

这可以保证线程安全

这可以大大降低锁冲突的概率(只有同时进行的两次修改,恰好在修改同一个链表上元素时,才会触发锁冲突)

2.引入了CAS原子操作

哈希表有一个size(链表大小)这样的变量,针对像修改size这样的操作,直接借助CAS完成,不会加锁

3.针对读操作,做了特殊处理

上述的加锁,只是针对写操作来加锁

对于读操作,通过volatile以及一些精巧的代码实现,确保读操作不会读到“修改一半的数据”

4.针对哈希表的扩容,进行了特殊的优化,可以令操作更加稳定

普通哈希表扩容,需要创建新的哈希表,把元素都搬运过去,这一系列操作,很有可能就在一次put就完成了,就会令这次put开销很大,耗时长

ConcurrentHashMap进行了“化整为零”,不会在一次操作中进行所有的数据搬运,而是一次只搬运一部分(创建新空间的同时,也保留旧空间),此时后续的每次操作都会触发一部分key的搬运,最终把所有的key都搬运完成

当新旧空间同时存在时:

1.插入操作——直接插入到新的空间中

2.查询/修改/删除,都是需要同时对旧的空间和新的空间进行操作

http://www.lryc.cn/news/458833.html

相关文章:

  • 轻量服务器和云服务器ecs哪个好用一些?
  • 【交通标志识别系统】Python+卷积神经网络算法+人工智能+深度学习+机器学习+算法模型
  • 特种设备作业叉车司机试题附答案
  • 【Nginx系列】Nginx启动失败
  • 2024/10/12 计组大题专训
  • 2024年腾讯外包面试题(微创公司)
  • nginx运行时报:No rule to make target ‘build‘, needed by ‘deault‘.Stop
  • dvwa:暴力破解、命令注入、csrf全难度详解
  • Java-学生管理系统[初阶]
  • 微信小程序 详情图片预览功能实现详解
  • LeetCode 48 Rotate Image 解题思路和python代码
  • 余承东直播论道智能驾驶:激光雷达不可或缺,华为ADS 3.0引领安全创新
  • 51WORLD携手浙江科技大学,打造智慧校园新标杆
  • SAP SD学习笔记09 - 受注传票中的不完全Log 和 Business Partner(取引先机能)
  • 【ROS2】里程计(odometry)数据计算、发布
  • AcWing 187 导弹防御系统 暴搜
  • SpringSecurity(三)——自定义优化器
  • STM32通用定时器TIM3的PWM输出实验配置步骤
  • device tree 预研
  • 英伟达股价分析:英伟达股价能否上涨到150美元,接下来该如何操作?
  • Rust 快速入门(一)
  • java 程序在服务器出现时区错误问题(使用Date,LocalDateTime,ZonedDateTime都不正确)
  • Kotlin 语言的协程是什么?
  • uniapp 游戏 - 使用 uniapp 实现的扫雷游戏
  • LeetCode组合总和
  • MATLAB - 机械臂手眼标定(眼在手内) - 估计安装在机器人上的移动相机的姿态
  • 【Unity】TextMeshPro 3.0.9无法显示emoji表情问题
  • 金九银十软件测试面试题(800道)
  • 中国剩余定理 C++
  • 动态规划lc