Java并发编程中的HashMap、HashTable、ConcurrentHashMap

news2024/12/25 9:01:12

在这里插入图片描述

1、HashMap

1.1、为什么HashMap非线程安全的

(1)竞态条件

  • 当多个线程同时对 HashMap 进行写操作(如插入、删除、修改),由于没有同步控制,可能会导致数据不一致的情况。
  • 例如,两个线程同时向同一个空的 HashMap 插入不同的键值对,由于没有互斥操作,它们可能会同时触发扩容操作,导致其中一个线程的插入操作被覆盖或丢失。

(2)死循环(JDK1.8 之前)

  • 在多线程环境下,如果一个线程正在进行 HashMap 的结构调整(如扩容),而另一个线程正在进行读取或修改操作,可能会导致读取或修改操作陷入死循环。
  • 这是因为在结构调整期间,HashMap 的链表结构可能会发生变化,而另一个线程可能无法正确地遍历或定位到元素。
死循环示例
  • 前置知识
    在这里插入图片描述
  • 死循环执行步骤

在这里插入图片描述

(3)JDK1.8 开始便没有了死循环问题

  • JDK8 将 HashMap 的结构作了下修改,将原来的链表部分改为数据少时仍然链表,当超过一定数量后变换为红黑树。
  • 红黑树:一种自平衡的二叉搜索树(Binary Search Tree),它在每个节点上增加了一个额外的属性来维持平衡。红黑树的平衡性质使得它在插入、删除和查找等操作的时间复杂度上具有较好的保证,为O(log n)。

通过上面的分析,不难发现循环的产生是因为新链表的顺序跟旧的链表是完全相反的,所以只要保证建新链时还是按照原来的顺序的话就不会产生循环。

  • JDK8是用 head 和 tail 来保证链表的顺序和之前一样,这样就不会产生循环引用。

1.2、保证HashMap线程安全的方案

  • 【方案1】使用Hashtable线程安全类
  • 【方案2】使用Collections.synchronizedMap方法,对方法进行加同步锁
  • 【方案3】使用并发包中的ConcurrentHashMap类

2、HashTable

2.1、HashTable性能问题

  • Hashtable 是一个线程安全的类,Hashtable 几乎所有的添加、删除、查询方法都加了synchronized同步锁!
  • 相当于给整个哈希表加了一把大锁,多线程访问时候,只要有一个线程访问或操作该对象,那其他线程只能阻塞等待需要的锁被释放,在竞争激烈的多线程场景中性能就会非常差,所以 Hashtable 不推荐使用!

2.2、Collections.synchronizedMap性能问题

  • Collections.synchronizedMap 里面使用对象锁来保证多线程场景下,操作安全,本质也是对 HashMap 进行全表锁!
  • 使用Collections.synchronizedMap方法,在竞争激烈的多线程环境下性能依然也非常差,所以不推荐使用!

3、ConcurrentHashMap

在这里插入图片描述

CHM是弱一致性的

  • 添加元素后,不一定马上读到
  • 清空之后,可能仍然会有元素
  • 遍历之前的变化,可以读到
  • 遍历之后的变化,无法读到
  • 遍历时元素发生变化,不抛异常

在这里插入图片描述

3.1、JDK1.5、JDK1.6分段锁

在这里插入图片描述

  • JDK1.5对key进行hash,然后用hash值的高位查找segment[],低位则查找table[]
  • JDK1.6的优化是得到的hash值高位和低位在segment[]和table[]分布更均匀
  • 分16段,所以在理想状态下,ConcurrentHashMap 可以支持 16 个线程执行并发写操作(如果并发级别设为16),及任意数量线程的读操作

3.2、JDK1.7分段锁懒加载

在这里插入图片描述

  • JDK1.5、JDK1.6是直接初始化16个segment
  • JDK1.7则是用到哪个segment再初始化哪个,没用到的不初始化
  • JDK1.7的segment使用volatile修饰

3.3、JDK1.8摒弃分段锁

在这里插入图片描述

  • volatile直接修饰table
  • 加锁也直接加到table上

为什么HashMap会产生死循环

多线程下的HashMap死循环问题详解

彻头彻尾理解 ConcurrentHashMa

一文彻底弄懂ConcurrentHashMap

ConcurrentHashMap

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

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

相关文章

LLM 生成视频 - pika

文章目录 关于 pika申请试用2023-07-12 关于 pika A powerful Text-to-Video platform that can unleash your creativity simply by typing. 官网: https://www.pika.art/官方 twitter : https://twitter.com/pika_labs相关功能介绍 相关报道/博客: 图片生成视频 from : h…

如何给视频配音?这几种配音方法一看就会

怎么给视频进行配音呢?如果原始视频的录音质量较差,存在噪音、回音或杂音等问题,配音可以用来替换原始音频,以提高声音质量和清晰度,或者是我们想要给视频配上一段搞笑的方言配音,怎么怎么做呢?…

超级自动化的3年:财务、IT等通用场景占比高达65%,垂直领域玩家开始晋级

从信息化时代走向数字化时代,企业的最终目标即利用先进的数字技术完成数字化转型升级,而这绝不是将业务、流程、数据、表单等搬到线上就“完事⼉”。 在此背景下,Gartner于2019年提出“超级自动化”,之后全球范围内越来越多的企业…

【C++】-关于vector的两个习题(二维数组和多路递归)

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你…

论文浅尝 | 少样本学习的语言模型的持续训练

笔记整理:王贵涛,东南大学硕士,研究方向为自然语言处理 链接:https://github.com/UIC-Liu-Lab/CPT 一、动机 克服灾难性遗忘(CF)是持续学习(CL)的一个主要目标。目前有许多方法&…

施密特(Gram-Schmidt)正交化

引自于点击打开 如果没有空间向量解析几何基础,理解起来有些困难,因此稍微解说一下。 两个向量的正交变换我们分为3步: (a1,a1)/ (|a1| * |a2|)是a1,a2之间的夹角的cos值cos值乘以|a2|后,得到a2在a1上映射的长度值&…

从浏览器进程角度分析从输入URL到页面显示发生了什么?

一、处理用户在浏览器地址栏中输入的URL(统一资源定位符) 用户在地址栏输入内容并按下回车,浏览器会检查输入是否符合 URL 规则,以Chrome为例,它会根据相应的规则,将地址栏输入解析成搜索请求或者URI请求。…

YOLOv8实战垃圾分类目标检测 (视频课程)

课程链接:https://edu.csdn.net/course/detail/38804 垃圾分类是一项利国利民的民生工程,需要全社会的共同参与。 YOLOv8是前沿的目标检测技术,它基于先前 YOLO 版本在目标检测任务上的成功,进一步提升性能和灵活性。 本课程将手…

已解决 BrokenPipeError: [Errno 32] Broken pipe

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

第三次CCF计算机软件能力认证

第一题:门禁系统 涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况。 每位读者有一个编号,每条记录用读者的编号来表示。 给出读者的来访记录,请问每一条记录中的读者是第几次出现。 输入格式 输入的第一行包含一个整…

《前端开发 实践之 腾讯地图API 学习》

目录 腾讯地图基础入门方式一方式二 事件监听监听地图瓦片加载完成事件 移除缩放控件 & 旋转控件 & 比例尺控件初始化marker图层创建信息窗点击地图拾取坐标打点标记反解析成详细地址根据输入详细地址 反解析成经纬度 腾讯地图 腾讯地图API学习-官方地址:ht…

浅谈Web前端开发软件包管理器—Bower的基本使用

前言 Bower 是一个客户端的软件包管理器,它可用于搜索、安装和卸载如 JavaScript、HTML、CSS 之类的网络资源,Bower 是 Web 开发中的一个前端文件包管理器,类似于 Node 模块的 npm 包管理器,bower 依赖于 Git、Node 和 npm。 安…

HarmonyOS课程尝鲜计划,优享特权大礼包

报名入口:https://developer.huawei.com/consumer/cn/activity/901689042385499023

Mendix Excel导入组件的分析和应用

一、前言 企业在发展的过程中会使用各种各样的系统,其中很多系统用了5-10年,我们称之为遗留系统存在诸多风险:维护耗时、中断频繁、用户不友好、与新软件的兼容性问题等。总有一天,这些庞大的问题会垄断IT资源,使数字…

事物的属性与观察者有关吗?

我们通常对世界的看法是以分析和概念为基础的,我们倾向于将事物划分为各种相对的存在和概念。然而,有些领域超越了这种相对的观点,揭示了所有现象的无常性、空虚性和无自性,认识到它们的真实本质。如在人机环境系统中就认为&#…

【车载Android】多用户(一) - Linux用户与Android多用户

现如今手机这样的移动设备已经是人手一台了,但是汽车依然是以家庭为单位使用,不同的家庭成员对于汽车的使用存在着差异,比如空间、功能、影音风格等。因此,“智能汽车”需要具备千人千面的特性,能够适应不同的用户和场…

Linux中Makefile详细教程

目录 Makefile Makefile的介绍 Makefile简单的编写 .PHONY 问题: 如果只执行make,它执行的是Makefile里哪一段语句呢? 怎么知道我的可执行程序是最新的呢? Makefile编译多个文件 进度条小程序 Makefile Makefile的介绍 …

Acwing.860 染色法判定二分图(二分图染色法)

题目 给定一个n个点m条边的无向图,图中可能存在重边和自环。 请你判断这个图是否是二分图。 输入格式 第一行包含两个整数n和m。 接下来m行,每行包含两个整数u和v,表示点u和点v之间存在一条边。 输出格式 如果给定图是二分图&#xff0c…

openpnp - 汇川 Inovance IS620PS2R8I-IAB-C的参数读取

文章目录 openpnp - 汇川 Inovance IS620PS2R8I-IAB-C的参数读取概述笔记伺服和配套电机型号官方伺服调试软件笔记H00H01H02H03H04H05H06H07H08H09H0AH0BH0CH0DH0FH11H12H16H17H30H31自定义组备注END openpnp - 汇川 Inovance IS620PS2R8I-IAB-C的参数读取 概述 设备中用到了…

Enterprise:使用 MySQL connector 同步 MySQL 数据到 Elasticsearch

Elastic MySQL 连接器是 MySQL 数据源的连接器。它可以帮我们把 MySQL 里的数据同步到 Elasticsearch 中去。在今天的文章里,我来详细地描述如何一步一步地实现。 在下面的展示中,我将使用 Elastic Stack 8.8.2 来进行展示。 无缝集成:将 Ela…