《JavaEE》HashTable、HashMap、ConcurrentHashMap

news/2025/3/14 16:55:37/

目录

HashTable

HashMap

ConcurrentHashMap

​编辑

HashTable与ConcurrentHashMap的区别


👑作者主页:Java冰激凌
📖专栏链接:JavaEE

进入到线程模块 必不可少的就是接触到线程安全的数据结构 例如StringBuffer、BlockingQueue、PriorityBlockingQueue 等等 今天要了解的是HashTable、ConcurrentHashMap

HashTable

         底层其实还是跟HashMap一样的 但是他在每次修改的时候都加了锁 所以能够保证每次在对于HashTable中的内容进行修改的时候线程安全 对于读的操作不会产生线程不安全的问题 所以不会处理 但是因为每次进行修改都要加锁 频繁加锁的话消耗是比较大的 所以此处理方式不推荐 效率会大大的进行折扣


HashMap

        我们在之前的博客已经详细的介绍过了HashMap 并且也认真的分析过了源码等等 如果想要对于HashMap进行了解可以点击跳转

                        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​《数据解构》HashMap源码解读http://t.csdn.cn/WgPAg


ConcurrentHashMap

        ·底层采用的数组加链表 

        ·本质还是与HashMap一致

        ·主要采用的是分段思想 会将一个长度为N的数组分割为N组 每一组单独使用一个锁

        `加锁策略与HashTale不同 ConcurrentHashMap是对于单个key进行加锁的 可以看看下方绘图理解

错误原因的出现

 此处如果两个线程对于同一个key进行修改 此处会出现线程安全问题 对于修改会出现只有一个生效

 此处ConcurrentHashMap的处理策略就是对于每个key都加锁


HashTable与ConcurrentHashMap的区别

        相同:在出发点上 都是为了保证线程安全的

        不同:加锁策略不同 HashTable是对于整个进行加锁 ConcurrentHashMap是对于单个位置进行加锁 所以说 ConcurrentHashMap的效率是优于HashTable的 (此处的效率提升体现在两个线程痛死修改不同位置的元素中)ConcurrentHashMap是对于同一个位置的元素修改 是跟HashTable效率一样的

 我们也配一个形象的例子 假设你现在去银行办理业务 我们此时提供了16个窗口 当你进入到一个窗口的时候 这个窗口便会加锁 只为你一个人提供服务 别人是无法进入的 每个窗口都是同样的道理

那么HashTable是什么样子呢 也就是一个银行只对于一个人服务 当你进入银行的时候 哗啦 把窗帘往下一拉 门一锁 那么此时 别人也想到银行办理业务就只能等待 等待你办理完业务 拉开窗帘打开门之后才可以使用

(因为源码比较繁琐 就不拿出来单独解释了 源码中的区别也是体现在HashTable是对于put方法整个加锁的  而ConcurrentHashMap是取出位置后才进行加锁的)

  1. ConcyrrentHashMap减少了锁冲突 就让锁加到每个链表的头节点上 (锁桶)
  2. ConcurrentHashMap只是针对写操作加锁了 读操作没加锁 而只是使用了volatile
  3. ConcurrentHashMap中更广泛的使用CAS 进一步提高效率
  4. ConcyrrentHashMap针对扩容 进行了巧妙的化整为零

http://www.ppmy.cn/news/39433.html

相关文章

2023年造林绿化施工单位丙级资质,新申请要配备多少个人员呢?

(一)新申请资质程序: 1.网上申请。 2.书面材料报送。 (二)资质等级:分为甲级、乙级、丙级三个等级。 (三)丙级施工单位资质条件: 3.1 资历和信誉 应同时具备以下条…

常量和符号常量(C语言)

常量和符号常量一、常量(一)常量的定义在程序运行过程中,其值不能被改变的量称为常量。(二)常量的数据类型整型常量(1) 整型常量就是整常数。(2) 整型常量的表现形式&…

随笔-如果我有两百万就好了

前天晚上十点,小付给我发了个微信,说先前带他买房的中介得到消息,在他同楼二单元有套房子在售,房主要求全款,230万,让我考虑下。 和媳妇儿算了算,距离230还有很大的差距,如果借债&a…

Apache Pulsar的Connector连接器使用

目录1. 背景2. 介绍3. Pulsar Flink Connector3.1 Flink读取Pulsar消息3.1 Flink发送消息到Pulsar1. 背景 虽然可以使用produce和consume的API进行消息的发送和消费,但Pulsar提供了一种更简便的方式,用来同步其它系统的数据到Pulsar的topic,…

Centos安装docker以及通过docker部署Mysql,照做就行!

1.安装docker 1.1给虚拟机联网(反斜杠带表该语句没写完) yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken 1.2更新本地文件镜像 # 设置docker镜像源 yum-config-manager \--add-repo \https://mirrors.aliyun.com/doc…

数据库系列之MySQL线程ID和操作系统线程ID对应关系

在日常运维工作中,MySQL数据库服务器出现SQL语句执行导致服务器CPU使用率突增,如何通过现有手段快速定位排查到哪个SQL语句,并采取应急措施。本文介绍基于传统的操作系统线程的CPU使用监控手段入手,利用操作系统线程ID和MySQL线程…

联想笔记本功能键切换Fn+ESC

按下FnESC可以切换 Fn键的常驻状态。

华为阿里版ChatGPT横空出世,谁的成效更好呢?

“你训练的大模型涌现了吗?”“还没有。好难受。”一时间成为了最近AI赛道玩家的一个爆热梗。 不管承不承认,相信每个玩家都不愿意输掉这场激烈的竞争。自百度成为国内“第一个吃螃蟹的人”后,又有两大中国科技巨头做好了准备——华为和阿里…