HashTable,HashMap和ConcurrentHashMap

news2025/2/25 9:26:24

1. 在多线程环境下使用哈希表

 1.1 HashMap

对于HashMap来说肯定是不行的,因为HashMap线程是不安全的。

1.2 HashTable

  HashTable是直接在方法上使用synchronized,就相当于对this加锁。(此时,尝试修改俩个不同链表上的元素,都会发生冲突)可以仔细思考一下如果在不同链表上的元素,不涉及到线程的安全问题,修改不同的量。此时针对不同的链表,就不必加锁了。(不要产生锁冲突)

   而且HashTable的扩容是一把梭哈,就会使它不稳定时快时慢,很影响用户的体验,如果元素过多,效率则非常低,其它线程阻塞等待的时间也会更长。还有官方也不推荐使用HashTable了。

1.3 ConcurrentHashMap

  其实在java 1.7及以前,ConcurrentHashMap是通过“分段锁”来实现的。给若干个链表分配一把锁,这种设定,不太合适实现复杂,效率也不够,引入额外的空间开销。java8后就该为每个链表一把锁了(缩小了锁的粒度)。

 

 1.读操作不加锁

ConcurrentHashMap只对写操作进行加锁,读操作没有加锁,此时会有三种情况:

(1) 两个线程同时修改一个哈希桶时才会产生锁冲突;

(2) 两个线程同时读数据,不会有锁冲突;

(3) 一个线程修改,一个线程读,也没有锁冲突。

第三种情况可能会有线程不安全问题,这和我们写的代码有关,但是ConcurrentHashMap中的读操作使用了Volatile,来保证读到的数据不是修改了一半的数据。
2.利用了CAS的特性

  因为synchronized里头一开始是偏向锁或轻量级锁,但是可能升级为重量级锁,这个过程不可控,充分的使用CAS就可以减少一些加锁。例如(针对哈希表元素个数的维护)。

3.针对扩容的优化

ConcurrentHashMap则是每次操作都只搬运一部分元素(化整为零,蚂蚁搬家)。它在扩容过程中,同时存在俩份哈希表,一份旧的,一份新的。插入操作,直接往新的插入。删除操作,新的旧的都删除。查找操作,新的和旧的都得查询一下。

总结

1、HashMap线程不安全,适用于单线程环境,key值可以为null;

2、HashTable线程安全,但锁的是整个Hashtable对象,效率较低,key值不可以为null;

3、ConcurrentHashMap线程安全,锁的是每个链表的头结点,降低了锁冲突的概率;充分利用CAS机制;优化了扩容方式;key值不可以为null,适用于多线程环境。
 

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

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

相关文章

c语言:编译和链接

翻译环境和运行环境 在ANSIC的任何⼀种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境,它用于实际执行代码。 编译过程 预处理(Preprocessing) 文件包…

[Python进阶] 正则表达式的验证

8.2 正则表达式的验证 正则表达式的语法很令人头疼,即使对经常使用它的人来说也是如此。由于难于读写,容易出错,所以找一种工具对正则表达式进行测试是很有必要的。 8.2.1 本地验证 通过Regex Tester这款软件可以在本地对正则表达式进行验…

CTF CRYPTO 密码学-3

题目名称:反编译 题目描述: 分析 题目给出一个pyc后缀的文件,需要使用uncompyle6模块去还原成py文件 uncompyle6简介 uncompyle6 是一个 Python 反编译器,它能够将 Python 字节码(.pyc 文件)转换回源代码&…

系统的可观察性是指什么?

系统的可观察性是指什么? 本文转自 公众号 ByteByteGo,如有侵权,请联系,立即删除 系统的可观察性是系统设计的重要一环。不可观察的系统无法度量、无法监控、无法改进。 日志、追踪和度量是系统可观测性的三大支柱。 下图显示了…

2019年认证杯SPSSPRO杯数学建模D题(第二阶段)5G时代引发的道路规划革命全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 D题 5G时代引发的道路规划革命 原题再现: 忙着回家或上班的司机们都知道交通堵塞既浪费时间又浪费燃料,甚至有的时候会带来情绪上的巨大影响,引发一系列的交通问题。据报道,每年交通拥堵使得美国…

怎么用Office的Excel将图片转为excel表格?

在处理大量的表格数据时,我们经常需要将图片中的表格转换成Excel格式,以便进行更高效的数据分析和处理。然而,手动将图片中的表格数据录入Excel是一项既耗时又容易出错的工作。那么,有没有一种方法能够快速、准确地实现图片表格到…

从2023年因果推断在线峰会看程序员的未来:掌握因果推理,洞悉数据背后的真相

在科技飞速发展的时代,程序员作为数字世界的建筑师,需要不断拓宽视野,汲取新知识,以应对日益复杂的问题和挑战。 2023年的因果推断在线峰会,为程序员们提供了一个了解因果推理的绝佳机会。本文将探讨程序员在峰会上可…

一种基于YOLO改进的高效且轻量级的表面缺陷检测网络, NEU-DET和GC10-DET涨点明显

💡💡💡本文摘要:一种基于YOLO改进的高效且轻量级的表面缺陷检测, 在NEU-DET和GC10-DET任务中涨点明显 目录 1.轻量且高效的YOLO 1.1 SCRB介绍 1.1.1 ScConv介绍 1.2 GSConvns 1.3 od_mobilenetv2_050 1.4 对应ya…

016-Vue-黑马2023:前后端分离开发(在线接口文档),前端工程化、Element、nginx

第三节 前后端分离开发 1、介绍 开发模式 前后端混合开发:传统开发模式 前后端分离开发:当前最为主流的开发模式 页面原型需求案例:分析出接口文档 离线开发文档示例: 2、YAPI(官网已停用) 202…

芯品荟 | 电脑机箱键盘副屏市场调研报告

一.产品简介 1.带TFT彩屏电脑机箱 2.带小TFT彩屏电脑键盘 为什么电脑机箱&键盘,要带屏? 带屏的电脑机箱&键盘客户群体? 电竞玩家、设计师、电子发烧友、股民...... 二、市场规模 中国电脑机箱年产量约6000万台,键盘年产量约3亿…

二次开发在线预约上门服务、预约到家系统 增加开发票功能 轮播图链接跳转 uniapp代码

客户具体要求: 1、在我的个人中心里面增加一个 开票功能,点击进去之后可以查看到能开票的订单列表,如果是个人是填写姓名电话邮箱,就是填写单位名称 税号 邮箱,提交申请到后台审核,如果审核通过后线下人工…

「 典型安全漏洞系列 」03.跨站请求伪造CSRF详解

引言:CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种攻击技术,通过使用用户的身份进行不诚实地操作,恶意用户可以在受害者(目标)的机器上执行一些未授权的操作。这可能会危及…

I2C总线和通信协议详解 (超详细配42张高清图+万字长文)

I2C总线和通信协议详解 (超详细配42张高清图万字长文) I2C(Inter-Integrated Circuit)通信总线,作为嵌入式系统设计中的一个关键组成部分,其灵活性和高效率使其在高级应用中备受青睐。本文旨在提供关于I2C通信总线的深度解析&…

齿轮齿条运动相关计算(博途S7-1200PLC脉冲轴组态)

有关S7-1200PLC脉冲轴相关应用介绍请参考下面的系列文章: S7-1200PLC脉冲轴位置控制功能块 https://rxxw-control.blog.csdn.net/article/details/135299302https://rxxw-control.blog.csdn.net/article/details/135299302S7-1200脉冲轴功能块 https://rxxw-control.blog.c…

这是一篇优雅的Springboot2.0使用手册

这是一篇优雅的Springboot2.0使用手册 最近再研究springboot的原理😋颇有收获,现在让我分享一下springboot如何使用吧~ 啥是Springboot 和书上理解的不同,我认为Springboot是一个优秀的快速搭建框架,他通过maven继承方式添加依…

【windows】右键添加git bash here菜单

在vs 里安装了git for windows 后,之前git-bash 右键菜单消失了。难道是git for windows 覆盖了原来自己安装的git ?大神给出解决方案 手动添加Git Bash Here到右键菜单(超详细) 安装路径:我老的 ? vs的gi…

c++可调用对象、function类模板与std::bind

函数调用与函数调用运算符 先写一个简单的函数&#xff0c;如下&#xff1a; /*函数的定义*/ int func(int i) {cout<<"这是一个函数\t"<<i<<endl; }void test() {func(1);//函数的调用 } 通过这个普通的函数可以看到&#xff0c;调用一个函数很…

黑盒测试,软件测试中的军体拳

黑盒测试&#xff0c;软件测试中的军体拳 让我们来讲一个故事黑盒测试的测试方法黑盒测试的测试方法用于黑盒测试的工具&#xff1a;黑盒测试可以识别什么黑盒测试的特点&#xff1a;黑盒测试的优点&#xff1a; 五星上将麦克阿瑟曾经说过“如果把白盒测试比做六脉神剑&#xf…

vue实现 marquee(走马灯)

样式 代码 <div class"marquee-prompt"><div class"list-prompt" refboxPrompt><span v-for"item in listPrompt" :title"item" class"prompt">{{item}}</span></div> </div>data() {…

快速入门Torch构建自己的网络模型

真有用构建自己的网络模型 读前必看刚学完Alex网络感觉很厉害的样子&#xff0c;我也要搭建一个可以看着网络结构实现上面的代码你已经很强了&#xff0c;千万不要再想实现VGG等网络&#xff01;&#xff01;&#xff01;90%你能了解到的模型大佬早已实现好&#xff0c;直接调用…