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

HashTable, HashMap, ConcurrentHashMap 之间的区别

 一、HashTable

只是将关键方法加上了锁(synchronized关键字)。

缺点:1.如果多线程访问同一个HashTable就回直接造成锁冲突。

            2.HashTable的size属性也是通过 synchronized来控制同步的,效率比较低。

            3.在扩容时会涉及大量的拷贝,效率十分低。

            4.key值不允许为null。

总结:一个HashTable只有一个锁,两个线程访问HashTable中的任意数据都会出现锁竞争。

二、HashMap

是线程不安全的,在多线程环境下,如果多个线程同时对 HashMap 进行读写操作,可能会导致数据不一致或出现并发修改异常等问题。

key值允许为null。

三、ConcurrentHashMap

相对于HashTable进行了优化,使用了更细的锁机制和CAS机制。以JDK1.8为例:

1.读操作没有加锁,但是使用了volatile来保证只从内存中读取结果。

2.对写操作进行了加锁,加锁方式依旧是synchronized,但是不是对整个对象进行加锁,而是对“桶”进行加锁(用每个链表的头结点作为锁对象),大大降低了锁冲突的概率。

3.size属性使用CAS来更新,避免了重量级锁的情况。

4.扩容策略改变:

<1>:发现需要扩容的线程,只创建一个数组,同时只搬几个数据过去。

<2>:扩容时期,新老数组同时存在。

<3>:后续每个来操作ConcurrentHashMap的线程,都会参与搬家的过程,每次只搬一小部分元素。

<4>:当搬好后,将老数组删除。

<5>:在搬家过程中,若执行插入操作,则只向新数组中插入。

<6>:搬家时,执行查找操作时,需要同时查找新老数组。

5.key值不允许为null。

总结:ConcurrentHashMap每个哈希桶上都有一把锁,只有两个线程恰好访问同一个哈希桶时才会出现锁冲突。


http://www.kler.cn/a/519155.html

相关文章:

  • 深入MapReduce——引入
  • 深度解析:基于Vue 3与Element Plus的学校管理系统技术实现
  • 【Project】CupFox电影网站数据爬取分析与可视化
  • (Halcon)轮廓等分切割(项目分析)
  • Vue2下篇
  • hedfs和hive数据迁移后校验脚本
  • 深入了解 HTTP 头部中的 Accept-Encoding:gzip、deflate、br、zstd
  • 【深入理解SpringCloud微服务】Sentinel规则持久化实战
  • 代码随想录算法训练营day31(补0124)
  • docker搭建redis集群(三主三从)
  • vue中使用jquery 实现table 拖动改变尺寸
  • linux 管道符、重定向与环境变量
  • 软件质量与测试报告5-压力测试 JMeter 与 Badboy
  • C语言进阶——3字符函数和字符串函数(2)
  • 即梦(Dreamina)技术浅析(二):后端AI服务
  • 蓝桥杯算法赛第25场月赛
  • Flutter:搜索页,搜索bar封装
  • mysql_use_result的概念和使用案例
  • OpenCV:二值化与自适应阈值
  • Chameleon(变色龙) 跨平台编译C文件,并一次性生成多个平台的可执行文件
  • JavaScript系列(43)--依赖注入系统实现详解
  • [极客大挑战 2019]BuyFlag1
  • vue高级组件封装 element组件二次封装
  • Maui学习笔记- SQLite简单使用案例
  • 基于ESP32的桌面小屏幕实战[6]:环境搭建和软件基础
  • 一次StarRocks分析的经历