7.jdk源码阅读之ConcurrentHashMap(上)

Java容器之ConcurrentHashMap源码分析(JDK 1.7与JDK 1.8对比)   在前面两篇博客 Java容器之HashMap源码分析、Java容器之Hashtable源码分析分别对JDK1.8中的HashMap、Hashtable的源码进行一些分析,在本篇博客将对ConcurrentHashMap容器的源码进行一些分析。 申明:在前两篇博客介绍了两个容器的增、删、改、查相关的API,并且给源码加上了中文注释,在本篇博客将只介绍一些关键的API,比如hash值的计算,put... 阅读详情

1.写在前面

上一篇文章,我们分析了一下HashMap的源码,这篇文章我们一起来看下ConcurrentHashMap的源代码,我先抛出几个问题:

  1. ConcurrentHashMap 和 HashMap有什么区别?比如创建、往Map中放入元素等等
  2. ConcurrentHashMap是怎么做到并发安全的?
import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapExample {
    public static void main(String[] args) {
        ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();

        // 插入元素
        map.put("apple", 1);
        map.put("banana", 2);
        map.put("cherry", 3);

        // 获取元素
        System.out.println("apple: " + map.get("apple"));
        System.out.println("banana: " + map.get("banana"));
        System.out.println("cherry: " + map.get("cherry"));

        // 更新元素
        map.put("apple", 10);
        System.out.println("updated apple: " + map.get("apple"));

        // 删除元素
        map.remove("banana");
        System.out.println("banana after removal: " + map.get("banana"));
    }
}

上面的代码介绍了ConcurrentHashMap的基本用法,我们接下来详细看看各个部分

2. 全局视角

在这里插入图片描述

  • AbstractMap 是 java.util 包中的一个抽象类,它提供了 Map 接口的骨架实现。ConcurrentHashMap 继承了 AbstractMap,并实现了 Map 接口的具体方法。
  • ConcurrentMap 是 java.util.concurrent 包中的一个接口,它扩展了 Map 接口,定义了一些额外的线程安全操作,如 putIfAbsent、remove 和 replace 等。
  • Serializable 是 Java 的一个标记接口,表示实现该接口的类可以被序列化。ConcurrentHashMap 实现了 Serializable 接口,以支持对象的序列化和反序列化。

3. 数据结构

在 JDK 8 中,ConcurrentHashMap 采用了一种混合的数据结构,结合了数组、链表和红黑树,以提高在不同负载下的性能。

  • 数组(Node<K,V>[] table):存储键值对的主要结构。
  • 链表:用于解决哈希冲突,当冲突不多时使用链表存储冲突的元素。
  • 红黑树:当链表长度超过一定阈值时(默认是 8),链表会转换成红黑树,以提高查询效率。

4. put操作实现原理

ConcurrentHashMap 的 put 操作是线程安全的,下面是其主要流程:

  1. 计算哈希值:根据键计算哈希值。
  2. 定位数组索引:根据哈希值定位到数组中的具体位置。
  3. CAS 操作初始化数组:如果数组未初始化,则通过 CAS 操作初始化数组。
  4. 插入元素:根据数组中当前位置的状态进行不同的操作:
  • 如果当前位置为空,则通过 CAS 操作插入元素。
  • 如果当前位置不为空且是链表结构,则遍历链表,检查是否存在相同的键,如果存在则更新值,否则插入新节点。
  • 如果当前位置是红黑树结构,则在树中插入元素
  1. 扩容:如果插入后数组的负载因子超过阈值,则触发扩容

系列文章

1.JDK源码阅读之环境搭建

2.JDK源码阅读之目录介绍

3.jdk源码阅读之ArrayList(上)

4.jdk源码阅读之ArrayList(下)

5.jdk源码阅读之HashMap

6.jdk源码阅读之HashMap(下)

7.jdk源码阅读之ConcurrentHashMap(上)

如何使用事务码SMICM分析ABAP代码发起的HTTP请求的错误 当我用CL_HTTP_CLIENT往一个外网的url发请求时,遇到错误:ICM_HTTP_SSL_PEER_CERT_UNTRUSTED 错误是从这段ABAP代码里抛出来的: CALL METHOD lo_http_client-&gt;get_last_error IMPORTING code = lv_sysubrc message = ev_error_message. "BREAK-... 阅读详情

相关推荐

工程师职级胜任力框架

一、前言 尽管这些年国内的IT行业发展迅速,但是仍然欠缺一套比较综合性的面向工程师的职级胜任力框架,造成国内很多工程师大都一心只想成为技术大牛,而忽视了自己全方位的工程师职业素养和能力的培养。 最近我有幸读到了Circle CI公司分享的工程胜任力矩阵,发现这份文档就是一份比较贴合互联网研发型企业的工程师职级胜任力框架,于是我在它的基础上,重新整理出了一份更适合国内工程师阅读的《工程师职级胜任力框架》,并把它分享在波波的github站点上,希望这份文档对工程师的职业开发和成长有帮助。注,Circle CI.

架构师波波的专栏 6318

ConcurrentHashMap源码阅读jdk1.7

ConcurrentHashMap源码(jdk1.7)阅读 ConcurrentHashMap类主要由一个Segment数组(Segment<K,V>[] segments)构成; Segment是一个ReentrantLock类,含有一个HashEntry<K,V>[]数组(HashEntry<K,V>[] table); Segment的数量size为并发级别concurrencyLevel的大小,默认为 DEFAULT_CONCURRENCY_LEVEL = 16

leonliu06的博客 276

Windows10内核逆向-2-KiSystemCall64的调用流程剖析

本文深入剖析了Windows 10 x64系统中KiSystemCall64函数的完整调用流程。从用户态触发syscall指令开始,详细讲解了如何通过swapgs切换内核栈、构建KTRAP_FRAME陷阱帧、进行SMAP/CFG等安全检查,到最终通过SSDT寻址并执行目标系统服务的全过程,揭示了系统调用从Ring 3到Ring 0切换的核心机制与安全设计。

weixin_29209805的博客 78

ConcurrentHashMap源码阅读(JDK1.7+JDK1.8)

文章目录一.jdk1.8实现关于UnSafe1.原子操作:tabAt2.原子操作:casTabAt3.原子操作:setTabAt4.get5.put6.clear7.remove二.JDK1.8实现1.Segment2.HashEntry3. 一.jdk1.8实现 关于UnSafe JDK中有一个类Unsafe,它提供了硬件级别的原子操作。JDK API文档也没有提供任何关于这个类的方法的...

了凡的博客 770

Cesium中实现GPU计算的泥石流地形侵蚀

通过模拟分析,可以提前识别可能发生泥石流的区域,为防灾减灾提供依据,及时发布预警,避免或减少人员伤亡和财产损失。:在建设公路、桥梁、水库等基础设施时,通过泥石流模拟分析,可以预测泥石流可能对这些设施的影响,帮助工程设计者采取合适的防护措施,确保设施的安全性。:模拟分析有助于为灾后救援工作提供科学依据,确定受灾区域的范围、救援难度等,为救援队伍制定合理的行动方案,提升救援效率。:泥石流是山区常见的地质灾害之一,通过模拟分析可以评估某一地区发生泥石流的风险,指导土地使用规划、人口迁移等决策。

weixin_43481439的博客 1308

ads传统功放设计笔记(3)

传统功放设计的流程一般包括以下这些步骤: 1、明确设计目标 2、选择功放管子 3、确定静态工作点 4、设计偏置电路 5、判断稳定性 6、负载与源牵引 7、输入输出阻抗匹配 8、原理图优化 9、大信号仿真 10、版图设计 11、版图联合仿真 12、pcb设计 第二节我们设计仿真了功放的原理图。之后我们需要对版图进行设计和仿真。 10、版图设计 首先将S参数控件都打叉,还要去掉电源、源负载阻抗、地、芯片、电容。在原先电容和芯片的位置加上gap,设置好长度和间隔。之后在电源引脚、输入输出引脚和隔离的两端加上端口。

qq_40995480的博客 6016

JDK源码阅读(7):ConcurrentHashMap类阅读笔记

ConcurrentHashMap public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements ConcurrentMap<K,V>, Serializable { ... } 参考: https://blog.csdn.net/hbtj_1216/article/details/76205903 https://blog.csdn.net/u012403290/art

pedro7k的博客 502

PX4|Gazebo模型加载失败排查指南:从环境变量到资源路径的全面解析

本文针对PX4与Gazebo联合仿真中常见的'Unable to get model name'错误,提供了从环境变量配置、资源路径排查到网络访问问题的全面解决方案。详细解析了GZ_SIM_RESOURCE_PATH等关键变量的作用与设置方法,并给出了离线模型库部署等一劳永逸的修复指南,帮助开发者彻底解决无人机模型加载失败问题。

weixin_29243063的博客 1224

【阅读源码系列】ConcurrentHashMap源码分析(JDK1.7和1.8)

文章目录深浅源码系列【ConcurrentHashMap源码分析(JDK1.7和1.8】一. JDK1.7的ConcurrentHashMap1. JDK 1.7 ConcurrentHashMap 数据结构2. 外层的put方法3. Segment的put方法4. rehash流程5. get方法6. size计算流程二. JDK1.8的ConcurrentHashMap1. 官方文档2. JDK 1.8 ConcurrentHashMap 数据结构3. 重要属性和方法4. put源码5 transf

徐明晓的博客 407

用树莓派搭建全功能NAS服务器(01):树莓派基础操作&OMV搭建

写在前面 对于文件互传来说,局域网和云盘的操作总是独立的,而且很难将两者的优势合为一体。如果想要集多种优势为一体,那么NAS应该就是较为完美的解决方案了。 在这个系列中我们尽量跳过一些枯燥的理论知识,专注于说明两件事:   1.NAS是什么&能做什么 2.搭建思路&怎么做   这中间也会涉及到一些方案的选择,同类方案我也会列出来和大家分享我已知的优缺点,有兴趣可以多种尝试。(侧重于软件) 虽然是用树莓派搭建的,但是对于debian linux系统下的NAS搭建有着很好的参

斯塔克家的真维斯的工作间 2万+

基于YOLOv11的工业零件表面缺陷检测系统:从原理到实现

工业质量控制是制造业的核心环节,表面缺陷检测作为其中重要组成部分,直接关系到产品质量和企业效益。本文详细介绍了一种基于YOLOv11深度学习算法的工业零件表面缺陷检测系统,包含完整的算法原理分析、数据集构建方法、模型训练策略以及用户界面设计。通过大量实验验证,该系统能够高效准确地检测零件表面的划痕、凹陷、锈蚀等多种缺陷,检测精度达到96.2%,满足工业实时检测需求。本文还提供了完整的代码实现和详细的技术文档,为相关领域的研究者和工程师提供参考。关键词:表面缺陷检测;YOLOv11;深度学习;工业视觉;

YOLO 562

源码阅读之ConcurrentHashMap(JDK1.7)

HashMap实际上是一个线性数组,数组上的每个元素都是一个链表(俗称桶)。 ConcurrentHashMap则是对这个线下数组进行了划分,划分成若干个段(segment),在并发操作时,会对对应的段加锁。 HashEntry:用来封装映射表的键 / 值对;Segment 用来充当锁的角色,每个 Segment 对象守护整个散列映射表的若干个桶。每个桶是由若干个 HashEntry 对象链接...

长风破浪会有时 422

硬件学习手册【总目录】

欢迎大家来到《硬件学习手册》,专栏主要包括 《硬件经验手册》《电子元器件器件手册》《PCB手册》《CPU手册》《元器件选型手册》五个分册。在开始专栏的更新前,博主先列出专栏的大纲,以供大家参考。大家直接点击大纲中的蓝色标题即可轻松传送。

fydar的博客 5827

惊艳四方,阿里架构师开源内部“JDK源码手册“,太强了

几乎所有的大神都会强调看源码,也强调源码的重要性;但是如何看源码,源码看什么?看了什么用?看了怎么用?困扰很多人,尤其是初学者。由浅入深看源码,探究多线程原理由浅入深看源码,探究多线程原理本手册的目的在于基于JDK 7和JDK 8,对整个Concurrent包进行全面的源码剖析。JDK 8中大部分并发功能的实现和JDK 7一样,但新增了一些额外的特性。例如CompletableFuture、ConcurrentHashMap的新实现、StampedLock、LongAdder等。

公众号:该用户快成仙了 141

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

阿里二面:听说过 HashMap 会导致CPU飙升100%吗?

一、问题描述经常有些面试官会问,关于这个问题,很多年前,在淘宝内网里就有很多的程序员发过这种帖子说,并且这个事发生了很多次。虽然 Java 官方明确表示,在多线程环境下不推荐使用 HashMap,但是对于这种问题,小编其实也比较意外,如果不是深入的去了解 HashMap,都不知道有这样的问题。为什么会产生死循环呢?下面我们来还原一下问题的经过。

lingqu+wx bjmsb06 1136

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ConcurrentHashMap-Jdk7-源码解读

ConcurrentHashMap-Jdk7-源码解读1. ConcurrentHashMap数据结构2. HashEntry3. Segment4. ConcurrentHashMap5. 总结6. 参考欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你

FengDuidui的博客 514

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ConcurrentHashMap源码阅读

一、ConcurrentHashMap与HashMap、HashTable的区别 1.HashMap 我们知道HashMap是线程不安全的,在多线程环境下,使用HashMap进行put操作有可能引起数据丢失,也有可能因为扩容而导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。 2.HashTable Hashtable和HashMap的实现原理几乎一样,差别无非是 (1)HashTable不允许key和value为null,而HashMap可以 (2)HashTable是线程安全的,Ha

duncan891101的专栏 190

JDK7 ConcurrentHashMap源码详细解读

HashMap是线程不安全的,多线程并发情况下容易导致死循环,Hashtable是线程安全的类,他在进行put和get时会给表上一把锁,其他线程就不能访问到数据,必须等上一个线程执行结束后才能访问,效率比较低,于是引入了ConcurrentHashMap,采用分段锁机制。 ConcurrentHashMap内存图: 重要参数 // 初始化默认值 16 static final int DEFAULT_INITIAL_CAPACITY = 16; // 默认加载因子 0.75 stati

一位打工仔的博客 427

jdk源码阅读顺序_还在为怎么阅读 JDK 源码犯愁吗?

简介这篇文章主要讲述jdk本身的源码该如何阅读,关于各种框架的源码阅读我们后面再一起探讨。笔者认为阅读源码主要包括下面几个步骤。设定目标凡事皆有目的,阅读源码也是一样。从大的方面来说,我们阅读源码的目的是为了提升自己的技术能力,运用到工作中,遇到问题快速定位,升职加薪等等。从小的方面来说,阅读某一段源码的目的就是要搞清楚它的原理,就是死磕,就是那种探索真相的固执。目的是抽象的,目标是具体...

weixin_39999222的博客 581

如何阅读jdk源码?

简介 这篇文章主要讲述jdk本身的源码该如何阅读,关于各种框架的源码阅读我们后面再一起探讨。 笔者认为阅读源码主要包括下面几个步骤。 设定目标 凡事皆有目的,阅读源码也是一样。 从大的方面来说,我们阅读源码的目的是为了提升自己的技术能力,运用到工作中,遇到问题快速定位,升职加薪等等。 从小的方面来说,阅读某一段源码的目的就是要搞清楚它的原理,就是死磕,就是那种探索真相的固执。 目的是抽象的,目标是...

彤哥读源码 449

JDK源码(1)-阅读指引

说在最前面的话: 其实JDK源码的阅读,网上资料特别多,我阅读的最主要目的是自己学习,所以我读的可能不那么好,我的角度是从源码和源码对应的注释读起,顺便还能练练英语。 接下来准备对JDK的常见源码进行一下阅读,特整理一个学习指南出来供大家参考: 一、准备工作 以JDK1.8版本进行阅读。我下载的是比较新的jdk8u版本。 源码下载地址:http://hg.openjdk.java.net...

十步杀一人-千里不留行 1845

java的JDK源码阅读顺序整理笔记

很多java开发的小伙伴都会阅读jdk源码,然而确不知道应该从哪读起。以下为小编整理的通常所需阅读的源码范围。 标题为包名,后面序号为优先级1-4,优先级递减 文章目录 1、java.lang 2、java.util 3、java.util.concurrent 4、java.util.concurrent.atomic 5、java.lang.reflect 6、java.lang.annotation 7、java.util.concurrent.locks

宜春 1951

ConcurrentHashMap 源码分析 - JDK1.7

声明 本文对 java.util.concurrent.ConcurrentHashMap的相关讨论全部基于 JDK1.7 源码, 另外, 在阅读本文前,需要读者对 java.util.HashMap有一定程度的了解, 比如基于 K-V 存储, 底层数据结构(jdk1.7/jdk1.8)等. 正文 阅读大纲 ConcurrentHashMap 的相关介绍 ConcurrentHashMap 的构造函数 ConcurrentHashMap 的 put 方法 ConcurrentHashMap

nimo10050的博客 231

JDK12 concurrenthashmap源码阅读

本文部分照片和代码分析来自文末参考资料 java8中的concurrenthashmap的方法逻辑和注解有些问题,建议看最新的JDK版本 建议阅读 concurrenthashmap 源码前过一遍源码前面的注释,参考资料第二篇的博客有注释翻译 概述 java8 的 concurrenthashmap 主要工作方式如下 : ...

weixin_34130389的博客 149
上一篇: 6.jdk源码阅读之HashMap(下)
下一篇: 8.jdk源码阅读之ConcurrentHashMap(下)
至真源
博客等级 码龄11年 665粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

至真源

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值