HashMap,HashTable和ConcurrentHashMap之间有什么区别?

前言

    在之前HashMap的学习中,我们可以知道HashMap是线程不安全的数据结构,它存储的一般是数据的键值对(Key-Value模型),其中Key允许为null,它底层是数组+链表的实现,当单个链表的数据元素过多时,会转变为红黑树,在多线程环境下,对某个HashMap对象进行操作,是无法保证线程安全的,具体产生哪种线程不安全问题,大家可以看我之前写的这篇博客:主要的线程不安全问题有哪些?在这基础之上,我们引入另外两种线程安全的哈希表:HashTable和ConcurrentHashMap.接下来我们来讨论一下HashTable和ConcurrentHashMap使用什么方法来保证线程安全?

目录

1.HashTable保证线程安全的方式.

2.ConcurrentHashMap保证线程安全的方式.

3.总结


1.HashTable保证线程安全的方式.

     ● 图例

     ● 解释

        大家可以从图例中看见HashTable是通过将整个HashTable对象进行加锁,从源码中可以看见HashTable的关键方法都加了锁,那么就意味着在多线程情况下,不管我对HashTable的某个对象进行任何增删改查操作,都可能会产生锁冲突.

注:在多线程的某些情况下,两个线程修改不同的链表的值或者往不同的链表中插入数据,是不会产生线程安全问题的,但是HashTable中是对整个HashTable对象加锁,两个线程会抢同一个HashTable对象,从而出现锁竞争,然后产生阻塞等待,这是没有必要的.


2.ConcurrentHashMap保证线程安全的方式.

     ● 图例

     ● 解释

        ConcurrentHashMap对HashTable做出了优化,它增加了锁的个数,即给哈希表中的每个链表的头结点加锁,那么在多线程环境下,两个线程对ConcurrentHashMap对象的不同链表进行增删改查操作时,是不会出现锁冲突的,即锁个数增加,冲突就会相对减少.使用volatile修饰变量保证每次都是从内存读取结果,避免发生内存可见性或指令重排序的线程不安全问题.


3.总结.(重点★)

     我们可以从三个方面分析HashTable和ConcurrentHashMap的区别:

     ①  它们加锁粒度不同,HashTable是对整个哈希表加锁,而ConcurrentHashMap是对每个链表头进行加锁,ConcurrentHashMap避免了不必要的加锁.

     ②  在ConcurrentHashMap中充分利用了cas(compare and swap)机制(无锁编程),像一些获取和更新元素个数等操作都是直接使用cas完成.且只针对写操作进行加锁.而HashTable没有,它是直接针对HashTable对象加锁.

     ③ 相比于HashTable, ConcurrentHashMap的扩容策略明显更好,当元素过多时,前者就会触发扩容操作,重新申请内存空间,一次性将旧的哈希表中的所有元素搬运到新申请的内存空间中,这样做会让成本很高,效率也会很低,而ConcurrentHashMap就不一样了,它每次只搬运一部分,两份哈希表,不断一边往新表中插入元素,另一边删除旧表的元素.

注:HashTable和ConcurrentHashMap的key都不可以为null.


还有很多不懂的地方,欢迎大家和我一起讨论学习~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代理服务器与CDN的概念

代理服务器 特点:本身不产生内容,处于中间位置转发上下游的请求和响应 面向下游的客户端:它是服务器面向上游的服务器:它是客户端 正向代理:代理的对象是客户端 隐藏客户端身份绕过防火墙(突破访问限制&am…

今天面了一个来京东要求月薪25K,明显感觉他背了很多面试题...

最近有朋友去京东面试,面试前后进行了20天左右,包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说,80%的人都会栽在第一轮面试,要不是他面试前做足准备,估计都坚持不完后面几轮面试。 其实&…

LeetCode-146. LRU 缓存

目录LRU理论题目思路代码实现一代码实现二题目来源 146. LRU 缓存 LRU理论 LRU 是 Least Recently Used 的缩写,这种算法认为最近使用的数据是热门数据,下一次很大概率将会再次被使用。而最近很少被使用的数据,很大概率下一次不再用到。当缓…

把ChatGPT接入我的个人网站

效果图 详细内容和使用说明可以查看我的个人网站文章 把ChatGPT接入我的个人网站 献给有外网服务器的小伙伴 如果你本人已经有一台外网的服务器,并且页拥有一个OpenAI API Key,那么下面就可以参照我的教程来搭建一个自己的ChatGPT。 需要的环境 Cento…

大数据分析工具Power BI(三):导入数据操作介绍

导入数据操作介绍 进入PowBI,弹出的如下页面也可以直接关闭,在Power BI中想要导入数据需要通过Power Query 编辑器,Power Query 主要用来清洗和整理数据。

Go分布式爬虫笔记(十七) 4月Day1

文章目录17 协程线程与协程对比调度方式调度策略栈大小上下文切换速度GMP调度循环调度算法如果本地运行队列已经满了,无法处理全局运行队列中的协程怎么办?查找协程的先后顺序主动调度被动调度抢占调度执行时间过长的抢占调度陷入到系统调用中的抢占调度…

leetcode:颠倒二进制位(详解)

前言:内容包括:题目,代码实现,大致思路及图示 题目: 颠倒给定的 32 位无符号整数的二进制位。 提示: 请注意,在某些语言(如 Java)中,没有无符号整数类型。…

ThreeJS-聚光灯物体投影(二十)

聚光灯(灯泡) 关键代码: //直线光(由光源发出的灯光) // const directionalLight new THREE.DirectionalLight(0xFFFFFF, 0.7); // directionalLight.position.set(10, 10, 10); …

【蓝桥杯冲刺】蓝桥杯12届省赛C++b组真题-编程题

目录 试题F:时间显示 解题思路 代码 试题G:砝码称重 解题思路 代码 试题H:杨辉三角 解题思路 代码 试题I:双向排序 解题思路 试题J:括号序列 解题思路 试题F:时间显示 【问题描述】 小蓝要和…

Linux总结(二)

基础IO 1.什么叫文件? 我们需要在操作系统的角度理解文件。 文件 = 文件内容 + 属性(所以即使是空文件,也会占空间,因为我们是需要保存文件属性的,属性也是数据,所以占空间) C/C++程序默认会打开三个文件流,叫做标准输入(stdin),标准输出(stdout),标准错误(std…

【新2023Q2押题JAVA】华为OD机试 - 服务依赖

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:服务依赖 题目 在某系统中有…

时间序列的迁移学习

目录 时间序列及其研究状况: 时间序列中存在迁移学习问题吗? 已有的时间序列建模方法的大致思路 迁移学习如何应用于时间序列建模? 本内容摘录于王晋东老师的《迁移学习导论》 时间序列及其研究状况: 所谓时间序列&#…

Linux权限提升—内核、SUID、脏牛等提权

Linux权限提升—内核、SUID、脏牛等提权1. 前言2. 基础信息收集2.1. 内核、操作系统、设备信息等2.2. 用户信息2.3. 用户权限信息2.4. 环境信息2.5. 进程与服务2.6. 安装的软件2.7. 服务与插件2.8. 计划任务2.9. 是否有存放明文密码2.10. 查看与主机通信信息2.11. 日志信息3. 脚…

基于混合整数规划方法的微网电池储能容量优化配置

代码相关资源:TOPSIS法(优劣解距离法) 风电场风速两参数weibull(威布尔)分布的MATLAB小程序 遗传算法优化神经网络,对光伏出力预测的优化设计,实现了部分功能 关键词:储能容量优化 储能配置 微网 编程…

10年花费9773亿,华为完成13000颗元器件国产替代,外媒:结束了

近期,华为的消息层出不穷,就在前几天,华为就释放出2个信号,任正非为代表的巨头纷纷表态及发言,显而易见的是,如今华为正处于生死攸关的重要阶段。那么华为释放了哪2个信号呢?其一是,…

centos7离线安装docker

前言 在没有互联网的情况下想要安装某些软件用docker是十分方便的一种方式,例如oracle。原生的oracle安装是非常麻烦的,本人亲眼目睹一个专门搞oracle的公司的人安装oracle三天没有成功!因此不得不学习在没有互联网的情况下使用docker来安装…

网络层IP协议和数据链路层

目录IP协议协议头格式分片网段划分特殊的IP地址IP地址的数量限制NAT技术NAT技术背景NAT IP转换过程NAPTNAT技术的缺陷NAT和代理服务器私有IP地址和公网IP地址路由路由表生成算法数据链路层认识以太网以太网帧格式认识MAC地址对比理解MAC地址和IP地址认识MTUMTU对IP协议的影响MT…

web自动化测试:Selenium+Python基础方法封装(建议收藏)

01、目的 web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”,通常都会作为广大测试从业者的首选学习对象,相较于C/S架构的自动化来说,B/S有着其无法忽视的诸多优势,从行业发展趋、研发模式特点、测试工具支持&…

SpringCloud学习2(Spring Cloud Netflix)负载均衡Ribbon、Feign负载均衡、Hystix服务熔断

文章目录负载均衡RibbonRibbon的作用代码实现生产者cloud1_provider实现配置文件在HiController中编写以下代码启动集群消费者cloud1_consumer实现引入依赖编写配置文件编写启动类,并给RestTemplate配置LoadBalanced注解编写RestController来测试Feign负载均衡简介F…

信息收集与运用

目录 一.实验目的 二.实验原理 三.实验内容 一.收集信息 二.猜解密码 三.密码强度检测 源码 测试用例 程序输出结果​编辑 ​四.小结与讨论 1.举出保护个人敏感信息的方法(最少三点)。 2.如何提高你的密码强壮性,以避免黑客利用密…