《JavaEE》HashTable、HashMap、ConcurrentHashMap

news2024/11/19 14:23:27

目录

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.coloradmin.cn/o/418988.html

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

相关文章

计网第五章.运输层—TCP的拥塞控制

以下来自湖科大计算机网络公开课笔记及个人所搜集资料 目录一、拥塞控制与流量控制1.1 拥塞控制的目的1.2 区分拥塞控制与流量控制二、四种拥塞控制算法2.1 慢开始和拥塞避免2.2 快重传2.3 快恢复一、拥塞控制与流量控制 1.1 拥塞控制的目的 先看一下什么是拥塞: …

AVL树介绍

AVL树AVL树的概念AVL树结点的定义AVL树的插入AVL树的旋转(1)左单旋(2)右单旋(3)左右双旋(4)右左双旋AVL树的验证AVL树的性能AVL树的概念 二叉搜索树虽然可以提高我们查找数据的效率…

第三章 Linux实际操作——vi和vim编辑器

第三章 Linux实际操作——vi和vim编辑器3.1 vi和vim的基本介绍3.2 vi和vim常用的三种3.2.1 正常模式3.2.2 插入模式3.2.3 命令行模式3.3 vi和vim基本使用3.4 各种模式的相互切换3.5 vi和vim的快捷键3.1 vi和vim的基本介绍 Linux系统会内置 vi文本编辑器Vim具有程序编辑的能力&…

hadoop单机版安装

文章目录1. 将安装包hadoop-3.1.3.tar.gz上次至linux中2. 进行解压操作3. 修改目录名称4. 配置环境变量5. 使用官方提供的jar包实现wordcount案例1. 将安装包hadoop-3.1.3.tar.gz上次至linux中 2. 进行解压操作 tar -zxvf hadoop-3.1.3.tar.gz -C /opt/softs/##tar: 解压打包的…

TikTok听证会后:走不出的隐私风暴和出不了的海

TikTok听证会结束一周。 这场来自大洋彼岸的漩涡紧扣着中国科技圈的心弦,这不是一场稀松平常的热点,而是一次样本实例的演绎,每一个企图出海,扩展生意版图的中国企业们,都在密切关注,希望在TikTok身上找到…

快排非递归/归并排序/排序总结

一、非递归实现快排 在某些情景下,递归可以利用分治思想,将一个问题转化为多个子问题,再转化为更多个最小规模的子问题。从而帮助我们解决问题。 但是,递归可能在效率和内存上产生问题。现如今,由于编译器的进一步优化…

图像分割中的混淆矩阵和利用混淆矩阵计算指标

目录 1. 介绍 2. 创建混淆矩阵 2.1 update 方法 2.2 compute 方法 2.3 str 方法 3. 测试 4. 完整代码 1. 介绍 语义分割中,性能指标可以利用混淆矩阵进行计算 这里实现的方法和图像分类中不一样,需要的可以参考:混淆矩阵Confusion M…

大数据技术——spark集群搭建

目录 spark概述 spark集群搭建 1.Spark安装 2.环境变量配置 3.Spark集群配置 4.启动Spark集群 存在问题及解决方案 请参考以下文章 spark概述 Spark是一个开源的大数据处理框架,它可以在分布式计算集群上进行高效的数据处理和分析。Spark的特点是速度快、易…

多路I/O转接 poll(了解)

poll() 的机制与 select() 类似,与 select() 在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是 poll() 没有最大文件描述符数量的限制(但是数量过大后性能也是会下降)。 p…

Java 进阶(8) 线程常用方法

常用方法 方法名 说明 public static void sleep(long millis) 当前线程主动休眠 millis 毫秒。 public static void yield() 当前线程主动放弃时间⽚,回到就绪状态,竞争下⼀次时间⽚。 public final void join() 允许其他线程加⼊到当前线程中。…

什么是缓存穿透、缓存雪崩、缓存击穿

缓存穿透 缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库,失去了缓存保护后端存储的意义。 解决方案 缓存空值 如果访问数据库后还未命中,则把一…

JVM OOM问题排查与解决思路

OOM原因 1. 堆溢出 报错信息: java.lang.OutOfMemoryError: Java heap space 代码中可能存在大对象分配,无法获得足够的内存分配 可能发生内存泄露,导致内存被无效占用以至于耗尽 2. 永久代/元空间溢出 报错信息: java.lang.O…

Python黑马程序员(Spark实战)笔记

1、基础准备 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyspark # 导包 from pyspark import SparkConf,SparkContext #创建SparkConf类对象 confSparkConf().setMaster("local[*]").setAppName("test_spark_app") #基于SparkXConf类对象创…

(十一)排序算法-选择排序

1 基本介绍 选择排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。 动画展示: 选择排序思想: 选择排序(select sorting)也是一种简单的…

【刷题篇】栈和队列

目录 一.前言🌈 二.有效的括号✨ a.题目 b.题解分析 c.AC代码 三. 用队列实现栈📏 a.题目 b.题解分析(辅助队列法) c.AC代码(辅助队列法) d.题解分析(就地存储法) c.AC代…

全面带你了解AIGC的风口

前言 一、AIGC的介绍 二、AIGC 的几个主要作用 三、实现AIGC过程的步骤 四、科技新赛道AIGC开始火了 五、AIGC对世界产生广泛的影响 六、AIGC技术的主要风口 😘一、AIGC的介绍 AIGC (AI Generated Content) 是指通过人工智能技术生成的各种类型的内容,…

SpringBoot学习3

一、JSR303数据验证 使用Validated进行数据验证,如果数据异常则会统一抛出异常,方便异常中心统一处理。 空检查 Null 对象为null NotNull 对象不能为 null,但可以是 空字符串(无法检验长度为0的字符串) NotBlank 检查约束字符串是不是为nul…

20230403在WIN10下通过ffmpeg调用NVIDIA的硬件加速wmv视频转码为MP4格式

20230403在WIN10下通过ffmpeg调用NVIDIA的硬件加速wmv视频转码为MP4格式 2023/4/3 15:50 最近向学习日语,找到日语发音的视频中,大多数是MP4格式,少量是WMV格式,PR2023貌似不能识别WMV格式。 于是:万能的ffmpeg上场了&…

使用GPT-4生成QT代码

一、概述最近ChatGPT火爆起来了,ChatGPT是一种基于GPT的自然语言处理模型,可以用于生成自然语言文本,例如对话、文章等。最近又发现了一个优秀且免费的代码生成工具Cursor ,Cursor集成了 GPT-4 ,可以帮助你快速编写、编…

动态规划:状态机DP和买卖股票问题【零神基础精讲】

买卖股票的最佳时机:无限次/冷冻期/k次【基础算法精讲 21】 来自0x3f:https://www.bilibili.com/video/BV1ho4y1W7QK/ 介绍了【买卖股票系列问题】与【状态机 DP】,包括【至多/恰好/至少】的讲解。 文章目录买卖股票问题和状态机DP(无限次)[1…