ConcurrentHashMap 在Jdk 17 不同版本中的优化和改进

ConcurrentHashMap 是 Java 中的一个高性能线程安全的哈希表实现,随着 JDK 版本的迭代,其内部实现也经历了多次优化和改进。每个版本的改动针对不同的场景和需求进行了性能提升和问题修复。以下分别描述了 JDK 7、JDK 8 和 JDK 17 的主要设计和区别,并探讨了 JDK 17 的优化。

JDK 7 中的 ConcurrentHashMap

在 JDK 7 中,ConcurrentHashMap 使用的是 分段锁(Segment-based locking) 的设计。这种设计是通过将整个哈希表分成若干段(Segment),每段锁住部分桶来允许更高的并发度。

  • 设计特点
    • 哈希表被划分为多个 Segment,每个 Segment 都是一个独立的小型哈希表。
    • 针对每个 Segment 使用一个独立的锁,也就是说,一个线程修改某个 Segment 的数据不会影响其他线程对其他 Segment 的访问。
    • 每次触发写操作时,只需要对相应 Segment 加锁,而不是全表加锁。
  • 优缺点
    • 在高并发下性能表现较好,读操作无需锁定,只锁定写操作。
    • 并发粒度取决于 Segment 的数量(默认是 16),并发度有限。
    • 容量扩展时,每个 Segment 独立扩容,操作较复杂。

JDK 8 中的 ConcurrentHashMap

JDK 8 对 ConcurrentHashMap 的实现进行了大幅改进,采用了更加细粒度的锁和无锁化设计,摒弃了 JDK 7 中的分段锁结构,转而引入基于 CAS(Compare-And-Swap)的操作和红黑树优化。

  • 设计特点
    • 引入了 Node 数组结构,直接取代了 Segments,并采用了与 HashMap 类似的方式存储键值对。
    • CAS 操作 :通过 Unsafe 类的 CAS 指令操作底层数据,避免了锁的使用。
    • 红黑树优化 :当链表长度超过一定阈值(默认 8)时,将链表转换为红黑树,以避免链表过长时导致的查询性能下降。
    • 扩容时使用分批迁移机制(Rehashing ),由多个线程共同完成,降低扩容引起的性能问题。
    • compute()computeIfAbsent() 等操作进行了额外的同步控制,以支持复杂操作的线程安全性。
  • 改进效果
    • 移除了分段锁的限制,并发性提高。
    • 在链表出现太长时性能瓶颈显著降低。

JDK 17 中的 ConcurrentHashMap 的优化和改进

随着 JDK 的演进,ConcurrentHashMap 在 JDK 17 中进一步完善了设计,修复了一些潜在问题,同时在结构和算法上进行了优化,提升了并发性能和稳定性。

1. 性能优化
  • 更好的 CAS 重试逻辑
    • CAS 失败时的回退算法(退避机制)在 JDK 17 中进一步优化,以减少自旋导致的 CPU 消耗。
    • 对热点桶(比如在高并发下频繁访问的区域)进行了优化,使冲突降低。
  • 减少内存屏障的开销
    • 在兼容 JMM(Java 内存模型)的约束下,减少了不必要的内存屏障,改善了具体操作中的指令开销。
  • 改进批量操作的并发性能
    • 提升了 forEach, search, reduce 等聚合操作的并行度和效率,尤其是在高并发场景下对大数据集的处理能力。
2. 锁冲突优化
  • 在高并发场景中,当多个线程试图访问同一个节点时,JDK 17 中对节点锁的分配和抢占做了额外优化。例如,通过更智能的锁竞争算法来减少线程切换带来的上下文切换成本。
3. 红黑树相关修复
  • 修复了一些早期版本中红黑树实现的边缘问题(例如某些极端情况下可能导致的死循环问题)。
  • 优化了树结构在并发扩容和修改时的效率。
4. 线程挂起与唤醒机制改进
  • 在高并发写操作下,当线程需要等待其他线程完成某个关键部分(如扩容操作)时,采用了更加轻量化的线程挂起与唤醒机制,减少了不必要的上下文切换和线程阻塞。
5. 代码质量和一致性
  • 官方对代码进行了持续重构与优化,重点解决一些此前版本的边界条件、竞争状态(race condition)等潜在问题。
  • 保持与其他并发集合类(例如 ConcurrentSkipListMap)的操作逻辑风格一致。

JDK 7、8 和 17 中 ConcurrentHashMap 的主要差异总结

特性

JDK 7

JDK 8

JDK 17

锁机制

使用分段锁(Segment

基于 CAS 和 synchronized

改进的 CAS,减少锁竞争

数据结构

Segment

+ 链表

Node

+ 链表 + 红黑树

更优化的 Node

+ 链表 + 红黑树

扩容机制

每个 Segment

独立扩容

分批迁移完成扩容

改进的扩容效率,线程间协作更高效

高并发性能

易受分段数量限制

支持更高并发

性能进一步优化,高并发吞吐率提升

复杂操作支持(如计算)

较为有限

支持 compute

等复杂操作

改进 compute

等方法的性能


总结

  1. JDK 7 采用的是分段锁模型,适合中等并发的场景。
  2. JDK 8 引入了 CAS 和红黑树机制,极大提升了高并发场景下的性能,并摒弃了分段锁设计,成为近代 JVM 中并发集合的基础。
  3. JDK 17 在 JDK 8 的基础上进一步提升了并发性能,对锁冲突、CAS 回退、扩容机制等进行了优化,并修复了红黑树实现中的一些边缘问题,适用于更高并发的场景。

通常情况下,使用 JDK 17 提供的 ConcurrentHashMap 即可获得最好的性能和健壮性。


 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

普通报表入门

1. 概述 报表设计主要可以分为新建报表、数据准备、报表主体设计、报表预览几大部分。其中报表主体可以分为大标题、小标题、表格数据、结尾几大部分,本文主要以普通报表为例,讲述如何按照报表设计流程快速设计一张报表。FineReport 版本为11.0 1.1 预期…

用deepseek学大模型08-cnn残差网络

残差网络 参考:https://blog.csdn.net/2301_80750681/article/details/142882802 以下是使用PyTorch实现的三层残差网络示例,包含三个残差块和完整的网络结构: import torch import torch.nn as nnclass BasicBlock(nn.Module):expansion…

AIGC(生成式AI)试用 21 -- Python调用deepseek API

1. 安装openai pip3 install openai########################## Collecting openaiUsing cached openai-1.61.1-py3-none-any.whl.metadata (27 kB) Collecting anyio<5,>3.5.0 (from openai)Using cached anyio-4.8.0-py3-none-any.whl.metadata (4.6 kB) Collecting d…

分享一款AI绘画图片展示和分享的小程序

&#x1f3a8;奇绘图册 【开源】一款帮AI绘画爱好者维护绘图作品的小程序 查看Demo 反馈 github 文章目录 前言一、奇绘图册是什么&#xff1f;二、项目全景三、预览体验3.1 截图示例3.2 在线体验 四、功能介绍4.1 小程序4.2 服务端 五、安装部署5.1 快速开始~~5.2 手动部…

node.js + html调用ChatGPTApi实现Ai网站demo(带源码)

文章目录 前言一、demo演示二、node.js 使用步骤1.引入库2.引入包 前端HTML调用接口和UI所有文件总结 前言 关注博主&#xff0c;学习每天一个小demo 今天是Ai对话网站 又到了每天一个小demo的时候咯&#xff0c;前面我写了多人实时对话demo、和视频转换demo&#xff0c;今天…

Java基础(其一)

1.八个基础数据类型&#xff1a; 整数型&#xff1a;int long short byte 浮点型&#xff1a;float double 字符型&#xff1a;char 布尔型&#xff1a;bool 1.1. byte 范围&#xff1a;-128 到 127&#xff08;8位&#xff0c;有符号&#xff09; 用途&#xff1a; 小范围…

【Linux AnolisOS】关于Docker的一系列问题。尤其是拉取东西时的网络问题,镜像源问题。

AnolisOS 8中使用Docker部署&#xff08;全&#xff09;_anolis安装docker-CSDN博客 从在虚拟机安装龙蜥到安装docker上面这篇文章写的很清晰了&#xff0c;我重点讲述我解决文章里面问题一些的方法。 问题1&#xff1a; docker: Get https://registry-1.docker.io/v2/: net/h…

Java:单例模式(Singleton Pattern)及实现方式

一、单例模式的概念 单例模式是一种创建型设计模式&#xff0c;确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例&#xff0c;是 Java 中最简单的设计模式之一。该模式常用于需要全局唯一实例的场景&#xff0c;例如日志记录器、配置管理、线程池、数据库…

【Python项目】文本相似度计算系统

【Python项目】文本相似度计算系统 技术简介&#xff1a;采用Python技术、Django技术、MYSQL数据库等实现。 系统简介&#xff1a;本系统基于Django进行开发&#xff0c;包含前端和后端两个部分。前端基于Bootstrap框架进行开发&#xff0c;主要包括系统首页&#xff0c;文本分…

通过VSCode直接连接使用 GPT的编程助手

GPT的编程助手在VSC上可以直接使用 选择相应的版本都可以正常使用。每个月可以使用40条&#xff0c;超过限制要付费。 如下图对应的4o和claude3.5等模型都可以使用。VSC直接连接即可。 配置步骤如下&#xff1a; 安装VSCODE 直接&#xff0c;官网下载就行 https://code.vis…

神经网络剪枝技术的重大突破:sGLP-IB与sTLP-IB

神经网络剪枝技术的重大突破:sGLP-IB与sTLP-IB 在人工智能飞速发展的今天,深度学习技术已经成为推动计算机视觉、自然语言处理等领域的核心力量。然而,随着模型规模的不断膨胀,如何在有限的计算资源和存储条件下高效部署这些复杂的神经网络模型,成为了研究者们亟待解决的…

深度集成DeepSeek大模型:WebSocket流式聊天实现

目录 5分钟快速接入DeepSeek大模型&#xff1a;WebSocket实时聊天指南创建应用开发后端代码 (Python/Node.js)结语 5分钟快速接入DeepSeek大模型&#xff1a;WebSocket实时聊天指南 创建应用 访问DeepSeek官网 前往 DeepSeek官网。如果还没有账号&#xff0c;需要先注册一个。…

Javascript网页设计案例:通过PDF.js实现一款PDF阅读器,包括预览、页面旋转、页面切换、放大缩小、黑夜模式等功能

前言 目前功能包括&#xff1a; 切换到首页。切换到尾页。上一页。下一页。添加标签。标签管理页面旋转页面随意拖动双击后还原位置 其实按照自己的预期来说&#xff0c;有很多功能还没有开发完&#xff0c;配色也没有全都搞完&#xff0c;先发出来吧&#xff0c;后期有需要…

使用html css js 来实现一个服装行业的企业站源码-静态网站模板

最近在练习 前端基础&#xff0c;html css 和js 为了加强 代码的 熟悉程序&#xff0c;就使用 前端 写了一个个服装行业的企业站。把使用的技术 和 页面效果分享给大家。 应用场景 该制衣服装工厂官网前端静态网站模板主要用于前端练习和编程练习&#xff0c;适合初学者进行 HT…

Ubuntu24安装MongoDB(解压版)

目录 0.需求说明1.环境检查2.下载软件2.1.下载MongoDB服务端2.2.下载MongoDB连接工具(可略过)2.3.检查上传或下载的安装包 3.安装MongoDB3.1.编辑系统服务3.2.启动服务3.3.客户端连接验证3.3.1.创建管理员用户 4.远程访问4.1.开启远程访问4.2.开放防火墙 0.需求说明 问&#x…

打造一个有点好看的 uniapp 网络测速软件

大家好&#xff0c;我是一名前端小白。今天想和分享一个有点好看的网络测速 uniapp 组件的实现过程。这个组件不仅外观精美&#xff0c;而且具有完整的功能性&#xff0c;是一个非常适合学习和实践的案例。 设计理念 在开始coding之前&#xff0c;先聊聊设计理念。一个好的测…

ESP32 ESP-IDF TFT-LCD(ST7735 128x160)自定义组件驱动显示

ESP32 ESP-IDF TFT-LCD(ST7735 128x160)自定义组件驱动显示 &#x1f33f;驱动参考来源&#xff1a;https://blog.csdn.net/weixin_59250390/article/details/142691848&#x1f4cd;个人相关驱动内容文章&#xff1a;《ESP32 ESP-IDF TFT-LCD(ST7735 128x160) LVGL基本配置和使…

Redis的简单使用

1.Redis的安装Ubuntu安装Redis-CSDN博客 2.Redis在Spring Boot 3 下的使用 2.1 pom.xml <!-- Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifac…

elabradio入门第四讲——位同步(符号同步)

位同步是数字通信系统中特有的一种同步技术&#xff0c;又称为码元同步。在数字通信系统中&#xff0c;任何消息都是一串信号码元序列&#xff0c;接收端为了恢复码元序列&#xff0c;则需要知道每个码元的起止时刻&#xff0c;以便对于解调后的信号进行抽样判决&#xff0c;这…

网络安全推荐的视频教程 网络安全系列

第一章 网络安全概述 1.2.1 网络安全概念P4 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或恶意的原因而遭到破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。 1.2.3 网络安全的种类P5 &#xff08;1…