JDK8 中 ConcurrentHashMap 变化

news2024/9/27 9:20:18
  1. 结构简单:JDK8 抛弃 JDK7 的 Segment 分段锁机制,由 JDK7 的两级数组变回了原来的一级数组。链表长度>=8,该链表转换为红黑树。
    在这里插入图片描述
  2. 降低锁的粒度:锁住数组的每个桶的头结点,锁粒度更小。(Hashtable 是锁住整个表、JDK7 的 ConcurrrentHashMap 是锁住一个段 Segment。而这里是锁住一个链表或者一个红黑树)
  3. 锁变化:不使用 Segment 锁(继承 ReentrantLock),利用 CAS+Synchronized来保证并发安全。
  4. 并发扩容,多个线程参与。(JDK7 的 ConncurrentHashMap 的 Segement 数组长度固定不扩容,扩容的每个 HashEntry 数组的容量,此时不需要考虑并发,因为到这里的时候,是持有该 Segment 的独占锁的)
    注意:JDK8 中,Segment 类依旧存在,但只是为了兼容,只有在序列化和反序列化时才会被用到
  5. 更多的 Node 类型
    在这里插入图片描述
  • Node<K,V>:基本结点/普通节点。当 table 中的 Entry 以链表形式存储时才使用,存储实际数据。该类的 key 和 value 不为 null(其子类可为 null)
  • TreeNode:红黑树结点。当 table 中的 Entry 以红黑树的形式存储时才会使用,存储实际数据。ConcurrentHashMap 中对 TreeNode 结点的操作都会由 TreeBin 代理执行。
  • TreeBin:代理操作 TreeNode 结点。该节点的 hash 值固定为-2,存储实际数据的红黑树的根节点。因为红黑树进行写入操作整个树的结构可能发生很大变化,会影响到读线程。因此 TreeBin 需要维护一个简单的读写锁,不用考虑写-写竞争的情况。当然并不是全部的写操作都需要加写锁,只有部分put/remove 需要加写锁
  • ForwardingNode:转发结点。该节点是一种临时结点,只有在扩容进行中才会出现,该节点的 hash 值固定为-1,并且他不存储实际数据。如果旧 table的一个 hash 桶中全部结点都迁移到新的数组中,旧 table 就在桶中放置一个ForwardingNode。当读操作或者迭代操作遇到 ForwardingNode 时,将操作转发到扩容后新的 table 数组中去执行,当写操作遇见 ForwardingNode时,则尝试帮助扩容。
    在这里插入图片描述
  • ReservationNode:保留结点,也被称为空节点。该节点的 hash 值固定为-3,不保存实际数据。正常的写操作都需要对 hash 桶的第一个节点进行加锁,如果 hash 桶的第一个节点为 null 时是无法加锁的,因此需要 new 一个ReservationNode 节点,作为 hash 桶的第一个节点,对该节点进行加锁

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

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

相关文章

新型糖基化氨基酸:Fmoc-Thr((Ac4Galβ1-3)Me,Ac4Neu5Acα2-6AcGalNAcα)-OH,化学CAS号174783-92-7

●英文名&#xff1a;Fmoc-Thr((Ac4Galβ1-3)Me,Ac4Neu5Acα2-6AcGalNAcα)-OH ●外观以及性质&#xff1a; Fmoc-Thr((Ac4Galβ1-3)Me,Ac4Neu5Acα2-6AcGalNAcα)-OH中通过对蛋白进行复杂蛋白糖基化修饰&#xff0c;细胞产生了极大丰度的蛋白质类型&#xff1b;通过对各类糖基…

适合做读书笔记的工具 这款APP满足你的笔记需求

说到读书&#xff0c;就免不了要提到读书笔记。很多人认为&#xff0c;边读书边做笔记才能更好地帮助我们更深入地理解和记忆所读的书籍内容。通过记录书中的重要观点、论据、事实和例子&#xff0c;我们可以更好地掌握书中的知识和思想&#xff0c;而不是仅仅浏览、快速阅读或…

window环境下有事无法下载sentry-cli.exe包解决方案

报错&#xff1a;Error: Unable to download sentry-cli binary from解决方案&#xff1a;查看下载配置 可通过修改SENTRYCLI_CDNURL来改变下载包的地址&#xff0c;手动把包下载下来&#xff0c;然后更改地址 window可以使用&#xff1a;set SENTRYCLI_CDNURLxxx&& n…

led显示屏是如何扫描驱动的

LED显示屏的扫描驱动是指将图像信号分解并按行或按列逐行/逐列地驱动LED点阵&#xff0c;以显示完整的图像。以下是LED显示屏常见的两种扫描驱动方式&#xff1a; 静态扫描驱动&#xff1a; 静态扫描驱动是最简单和最常见的驱动方式。在静态扫描驱动中&#xff0c;每个LED像素都…

怎么利用代理IP优化网络爬虫

网络爬虫会自动扫描互联网&#xff0c;搜集大量数据并将它们组织起来。但是&#xff0c;许多网站都采取了反爬虫策略&#xff0c;限制了网络爬虫的活动。这时候&#xff0c;代理IP就起到了关键作用。 一、代理ip在网络爬虫中的作用 代理ip爬虫中使用代理IP有很多好处。首先&…

EasyExcel 批量导入并校验数据

文章目录 前言一、pom二、使用步骤1.导入对象2.读入数据并保存 前言 EasyExcel 批量导入并校验数据 一、pom <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.7</version></depend…

【图像处理】基于收缩系数的粒子群优化和引力搜索算法的多级图像阈值研究【CPSOGSA】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Android性能优化大法——内存优化

作者&#xff1a;layz4android 内存&#xff0c;是Android应用的生命线&#xff0c;一旦在内存上出现问题&#xff0c;轻者内存泄漏&#xff0c;重者直接crash&#xff0c;因此一个应用保持健壮&#xff0c;内存这块的工作是持久战&#xff0c;而且从写代码这块就需要注意合理性…

python数据分析案例

对订单的数据类型进行封装 # data_define.py # 对数据进行封装 ORM class Record:def __init__(self, date, order_id, money, province):self.date dateself.order_id order_idself.money moneyself.province province# 魔术方法&#xff0c;print Record对象时&#xff…

LC-1483. 树节点的第 K 个祖先(树上倍增算法)

1483. 树节点的第 K 个祖先 难度困难134 给你一棵树&#xff0c;树上有 n 个节点&#xff0c;按从 0 到 n-1 编号。树以父节点数组的形式给出&#xff0c;其中 parent[i] 是节点 i 的父节点。树的根节点是编号为 0 的节点。 树节点的第 k 个祖先节点是从该节点到根节点路径上…

开发板安卓主板定制开发-基于MT6765的考核管理终端方案

Mediatek Genio系列平台以其安全、可扩展、强大且优质的解决方案&#xff0c;受到全球设备制造商的信任。这个系列的平台已经被广泛应用&#xff0c;为不同的应用提供了高效、安全、稳定的解决方案。 在Mediatek Genio系列平台中&#xff0c;Mediatek Helio P35 (MT6765)是一款…

企业提升客户体验,得先搭建在线帮助文档

在企业竞争日益激烈的市场中&#xff0c;客户体验成为企业获得成功的关键因素之一。企业需要不断提升客户体验&#xff0c;以增加客户的忠诚度和满意度。而搭建在线帮助文档是提升客户体验的一个重要手段。本文将介绍为什么企业需要搭建在线帮助文档&#xff0c;并提供一些实用…

【Java SE】一文详解next和nextLine的区别

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 引入 总结:next()和 nextLine()方法的区别 类…

DVWA-5.File upload

前提 1、在实验时&#xff0c;需要在 DVWA Security模块&#xff0c;设置需要实验的级别&#xff0c;对于不同的级别&#xff0c;php会调用不同的代码去执行用户操作。对于low level&#xff0c;系统的安全性低&#xff0c;容易受到攻击。impossible级别&#xff0c;系统的安全…

STM32——06-STM32电动车报警器

项目需求 点击遥控器 A 按键&#xff0c;系统进入警戒模式&#xff0c;一旦检测到震动&#xff08;小偷偷车&#xff09;&#xff0c;则喇叭发出声响报警&#xff0c; 吓退小偷。 点击遥控器 B 按键&#xff0c;系统退出警戒模式&#xff0c;再怎么摇晃系统都不会报警&#xff…

SD va01/02 保存时,产生销售订单号后的增强

业务对接外围系统&#xff0c;在SAP下销售订单&#xff0c;要求实时传递到外围系统。要求先要有销售订单编号 策略 在销售订单保存后找一处增强&#xff0c;并做一个日志。 日志如下&#xff1a; 对象类型&#xff0c;凭证编号序列&#xff0c;外围系统编号&#xff0c;状态…

如何快速完成TensorRT模型生成和加速

0. 简介 之前作者在《深度学习之从Python到C》介绍了一些比较传统的方法&#xff0c;主要侧重介绍了如何将pth和pytorch传统形式文件转化为onnx的文件&#xff0c;这个部分的内容&#xff0c;也可以主要看一下《PyTorch模型部署&#xff1a;pth转onnx跨框架部署详解代码》这个…

江山变压器:以数据驱动决策,CRM铸就智能制造之「变」

浙江江山变压器股份有限公司(以下简称“江变”)&#xff0c;创始于1969年&#xff0c;全国变压器行业协会理事单位、全国输配电“十三五”规划的5家起草单位之一&#xff0c;被列入国家千家名牌培育工程。 公司主要客户为国家电网、南方电网、五大发电集团&#xff0c;产品远销…

微信小程序设置 本地图片为背景图

微信小程序 通过wxss进行设置 背景图报错 经查询&#xff0c;发现微信小程序中&#xff0c;将网络图片或base64图片设置为背景图片可正常显示&#xff0c;将本地图片设置为背景图片则不能显示&#xff0c;解决方法有三种&#xff0c;个人采用的是第三种方法。 1. 本地图片转换…