简单学习ConcurrentHashMap实现线程安全的原理

ConcurrentHashMap的实现原理 HashMap是Java当中很常用的数据结构。 但是HashMap不是线程安全的,单线程环境下还可以正常使用,不过在并发插入元素的时候有可能出现带环链表,让下一次读操作出现死循环。 那么什么样的哈希数据结构可以保证线程安全呢? 线程安全的哈希数据结构主要有HashTable和ConcurrentHashMap。而ConcurrentHashMap比HashTable的扩展性更好。 在多并发... 阅读详情

  提到多线程肯定想到数据的线程安全问题如何解决,util包中的Hashtable,Vector都是线程安全的,最初的时候也都会选择这几种数据存储方式,在前几年面试的时候也经常会被问到Hashtable与HashMap,Vector和ArrayList的区别。简单看一下Hashtable,Vector线程安全的实现方式,这两种都是直接对方法加synchronized,直接上代码,看一下Hashtable。

public synchronized V get(Object key) { //方法内部代码不再贴了,与这次学的东西无关 } 
public synchronized V put(K key, V value) {} 

Vector的方式也是这样。个别没有加上synchronized关键字的public方法,也是调用了对象内部的同步方法实现了同步或者用Collections.synchronized方式加上同步,使该方法实现同步。除了这样实现线程安全,还可以直接使用Collections.SynchronizedCollection对其他非线程安全的数据结构加锁实现线程安全。
  不管是对方法加synchronized,还是使用Collections.SynchronizedCollection实现同步,对对象的修改或者查询时,锁住的都是整个对象。 上面的实现方式确实解决了大部分线程安全问题,但随之而来的确实性能的下降。举个例子:用一个Hashtable存储了用户信息,每当一个用户有修改甚至查询请求时,整个Hashtable就要被锁住,也就是说,在这个玩家信息数据处理期间,所有用户的相关请求线程全部要等待,用户量级小的时候也许感觉不出来卡顿,如果放在当前互联网环境下,那将是灾难性的。
  进入正题,Java1.5之后加入了java.util.concurrent 包,这个包包含有一系列能够让 Java 的并发编程变得更加简单轻松的类。在这个包被添加以前,你需要自己去动手实现能够解决以上问题的工具包。这次主要学习一下ConcurrentHashMap的实现原理。
  ConcurrentHashMap定义了Segment内部类,看一下代码:

//Segment继承了ReentrantLock重入锁(这个概念这次先不看)
static final class Segment<K,V> extends ReentrantLock implements Serializable {
    //HashEntry与HashMap中类似,可以理解为一个单向链表元素,作为存放相同hash值不同key的键值对
    //这样一个Segment就相当于一个HashMap
    transient volatile HashEntry<K,V>[] table;
    V put(K key, int hash, V value, boolean onlyIfAbsent) {
        //在对Segment进行操作时,对当前对象加锁
        lock();
        try {
        //数据操作
        } finally {
           unlock();
        }
    }

}

ConcurrentHashMap通过数组形式存放多个Segment,用key的hash值做一次再hash当做下标识别当前键值对存放在哪个segment里。

  final Segment<K,V>[] segments;
  public V put(K key, V value) {
        if (value == null)
            throw new NullPointerException();
        //用key的hashCode再做一次hash
        int hash = hash(key.hashCode());
        return segmentFor(hash).put(key, hash, value, false);
    }

在对segment元素进行操作时加锁,这样当其它人线程操作当前ConcurrentHashMap对象时,只要key的hash值与加锁的值不同,就可以直接操作其它Segment元素。
示意图:
这里写图片描述


以上原理皆为JDK1.6版本源码,JDK1.8对ConcurrentHashMap做了大量修改,不仅去除了Segment概念,直接采用HashEntry保存数据,将锁也直接加载HashEntry,大大减少了数据冲突引起的延迟,还引入了红黑树算法,使hash之后在数组的分布更加均匀。对JDK1.8的源码学习之后补上。

Arm Neoverse CMN-700 SLC内存系统与缓存分区技术解析 现代处理器架构中,缓存一致性协议与内存子系统设计直接影响系统性能。Arm Neoverse CMN-700采用的SLC(System Level Cache)通过16-way组相联设计实现高效数据缓存,其物理地址索引机制支持灵活的way分区配置。在软件可配置内存(OCM)模式下,SLC可作为独立内存空间使用,通过寄存器控制实现模式切换与区域锁定。缓存分区技术则通过请求源分类和way-based分配策略,满足实时性任务与吞吐量场景的不同需求。这些技术在5G基站、边缘计算等低延迟场景中具有重要应用价值,特别是C 阅读详情

相关推荐

c# U盘禁用---守护进程(插入,拔出,卸载等操作)

一、简介 传统的对U盘禁用,我们多采用修改注册表的方式,详情参考:https://blog.youkuaiyun.com/qq_25372599/article/details/79815407;本文将介绍一种其他的方式–后台守护程序。其原理非常简单:当守护程序检测到U盘的插入信号,我们自动卸载U盘,致使系统无法识别U盘,达到禁用U盘的效果。 二、程序设计 2.1 变量定义 strin...

星星之火燃亮码空 2846

深入浅出ConcurrentHashMap(1.8)

1、深入浅出ConcurrentHashMap(1.8) 2、谈谈ConcurrentHashMap1.7和1.8的不同实现 3、ConcurrentHashMap的红黑树实现分析 ConcurrentHashMap相关的文章写了不少,有个遗留问题一直没有分析,也被好多人请教过,被搁置在一旁,即如何在并发的情况下实现数组的扩容。 什么情况会触发扩容 当往hashMap中成功插入一个key/v...

u014203489的博客 371

ESP32-P4实战:LVGL V9.4 PPA加速配置与性能对比

本文详细介绍了如何在ESP32-P4平台上配置LVGL V9.4的PPA硬件加速功能,通过启用PPA加速显著提升图形处理性能并降低CPU占用率。文章包含环境准备、配置步骤、性能对比及常见问题解决方案,帮助开发者高效利用ESP32-P4的PPA加速器优化嵌入式GUI应用。

rice5的博客 1190

ConcurrentHashMap是如何实现线程安全的

ConcurrentHashMap是如何实现线程安全的

林隐的博客 2686

农业杂草检测——棉花杂草数据集

然后将本层13×13的特征图谱经过×2上采样扩充到26×26,并与上层中26×26的特征图谱拼接,得到新的26×26的特征图谱,在该特征尺度上进行第二次预测,此时得到的特征图谱是相对输入图像16倍下采样,具有中尺度感受野,适合检测中等尺度对象;通过目标检测,能够及时清除杂草,减少病虫害的滋生和传播,保障棉花的健康生长,并有助于降低生产成本。对于地膜覆盖的棉田,由于膜内耕作层土温高、底墒好,杂草出苗早而集中,一般覆膜后5 - 7天杂草陆续出土,在墒情好的情况下,15天左右即形成出土高峰。

qq_38220914的博客 1246

最佳量化交易的计算机操作系统

本文在Creative Commons许可证下发布   我经常被问到的一个问题是:用哪种计算机操作系统和计算软件进行量化交易的理论研究和代码实现?   我想把这个问题简化,从挑选的计算软件和计算库来反推最佳使用的计算机操作系统。简而言之,就是在本文撰写的时候而言,如果你想进行基于任何严肃的数学理论和金融量化交易研究理论,这里特指机器学习或者深度学习。并且需要在本地研究机器上使用桌面版本,...

evilqliang的博客 2307

ConcurrentHashMap 线程安全的具体实现方式

ConcurrentHashMap 线程安全的具体实现方式 ConcurrentHashMap 是 Java 并发包中提供的一个线程安全且高效的 HashMap 实现,以弥补 HashMap 不适合在并发环境中操作使用的不足,本文就来分析下 ConcurrentHashMap 的实现原理,并对其实现原理进行分析! 一、摘要 在之前的集合文章中,我们了解到 Hash...

weixin_41563161的博客 1360

Python实战:解析腾讯视频M3U8加密链接并下载高清影片

本文详细介绍了如何使用Python解析腾讯视频M3U8加密链接并下载高清影片。从环境准备、抓包分析到核心代码实现,逐步讲解如何获取M3U8主链接、解析TS分片列表以及下载合并视频片段。文章还提供了多线程下载、断点续传和加密视频处理等优化方案,帮助开发者高效完成视频下载任务。

weixin_30836759的博客 525

ConcurrentHashMap原理

ConcurrentHashMap类中包含两个静态内部类HashEntry和Segment。HashEntry用来封装映射表的键值对;segment用来充当锁的角色,每个segment对象守护整个散列映射表的若干个桶,每个桶是由若干个HashEntry对象链接起来的链表。一个ConcurrentHashMap实例中包含由若干个Segment对象组成的数组。HashEntry用来封装散列映射的表中的...

weixin_36509612的博客 299

怎么调用onenet平台的API从而读取我们的设备数据和下发命令,做到控制开关

怎么调用onenet平台的API从而读取我们的设备数据和下发命令,做到控制开关 1、首先是怎么读取数据 读取的API是:http://api.heclouds.com/devices/datapoints?devIds=629063002 其中devids这个指的是你的设备ID 然后在我们的headers里面添加一些必要参数,就可以调用了 其中api-key的是你产品里面的master-apikey 把我们的参数写好就可以调用了,选择get方式,点击发送 这个value就是我们需要获取到的参数值了,

zyh960的博客 2万+

GEE高阶应用——如何绘制2000-2022年土地利用变化轨迹时序图

土地利用变化是指在一定时间范围内,土地利用类型和结构发生的变化。时序变化是指这种变化随时间的推移而发生的序列变化。土地利用变化轨迹的时序变化具体介绍如下:首先,土地利用变化轨迹的时序变化体现在土地利用类型的演变上。在过去的几十年里,随着人口的增加、经济的发展和城市化的推进,土地利用类型发生了显著的变化。传统的农田逐渐减少,而城市、工业、交通、居住等用地的面积不断扩大。同时,随着环境保护意识的提高,生态保护用地、森林、湿地等绿色用地的面积也在增加。

此星光明博客 1113

ConcurrentHashMap是如何保证线程安全的?

ConcurrentHashMap相当于是HashMap的多线程版本,它的功能本质上和HashMap没什么区别。因为HashMap在并发操作的时候会出现各种问题,比如死循环问题、数据覆盖等问题。而这些问题,只要使用ConcurrentHashMap就可以完美地解决。那问题来到了,ConcurrentHashMap它是如何保证线程安全的呢? 1、JDK1.7实现原理 首先,我们来看JDK1.7中ConcurrentHashMap的底层结构,它基本延续了HashMap的设计,采用的是数组加链...

Tom弹架构 1万+

YOLO系列算法改进 | C3k2改进篇 | 融合MambaOut轻量化门控架构 | 纯卷积实现超越Mamba性能的同时兼顾极致轻量化与边缘部署效率 | CVPR 2025

YOLO系列算法改进 | C3k2改进篇 | 融合MambaOut轻量化门控架构 | 纯卷积实现超越Mamba性能的同时兼顾极致轻量化与边缘部署效率 | CVPR 2025 (以YOLOv26最新目标检测模型为基础,利用C3k2_MambaOut创新模块进行改进)

2502_91881744的博客 224

ConcurrentHashMap是如何保证线程安全的

ConcurrentHashMap是如何保证线程安全的 之前分析过HashMap的一些实现细节,关于HashMap你需要知道的一些细节, 今天我们从源码角度来看看ConcurrentHashMap是如何实现线程安全的,其实网上这类文章分析特别多,秉着”纸上得来终觉浅,绝知此事要躬行“的原则,我们尝试自己去分析下,希望这样对于ConcurrentHashMap有一个更深刻的理解。 为什么说HashM...

JasonGaoH的专栏 6736

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

pscad IEEE标准系统搭建说明

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

高并发下ConcurrentHashMap到底是怎么实现线程安全的?

前言 这几天一直在看Java并发相关的知识,又学习了很多新的知识。看见大佬们一个个更博速度如此之快,可想知识渊博如滔滔江水。这一周就学习一些并发知识,搭建了一个ftp服务器,不知道小可爱们这周学习了那些知识呢?微信公众号【JustKeepCoding】 抛出正题:ConcurrentHashMap是如何实现线程安全,这里面又隐含那些玄机呢? 上一节讲述了Hashtable这个结构虽然线程安全,但是效率不高,就是因为他的每个操作都使用了synchronized同步块。因为synchronized同步块的

ShadowJava的博客 4720

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java——ConcurrentHashMap 的底层原理与线程安全机制

它可以支持高并发读,是因为它完全无锁,它支持高并发写,是因为它是分段锁,从而不像整把锁一样,使用细粒度锁减少了竞争,在多线程情况下能够协同扩容,随着并发量增加它的性能下降平缓,所以它性能稳定。通过这种设计,在保证线程安全的同时,大幅提升了并发性能,成为了Java并发编程中最常见的并发容器之一。t=P4F5。

2301_79714207的博客 1017

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

currenthashmap如何实现线程安全_高并发下ConcurrentHashMap到底是怎么实现线程安全的?

前言 这几天一直在看Java并发相关的知识,又学习了很多新的知识。看见大佬们一个个更博速度如此之快,可想知识渊博如滔滔江水。这一周就学习一些并发知识,搭建了一个ftp服务器,不知道小可爱们这周学习了那些知识呢?原文在csdn里,这里复制格式不正确。抛出正题:ConcurrentHashMap是如何实现线程安全,这里面又隐含那些玄机呢?原文:高并发下ConcurrentHashMap到底是怎么实现线...

weixin_39536630的博客 2159

深入浅出ConcurrentHashMap详解

JDK7 版本的 ConcurrentHashMap 简单介绍,以及 JDK8 的改动

学哥斌的博客 8万+

Java并发(五)ConcurrentHashMap如何解决线程安全问题

本篇将讲述Java中的ConcurrentHashMap是如何解决线程安全问题的,分JDK1.7和JDK1.8两个版本来介绍。

今天你学习了吗? 1万+

ConcurrentHashMap确实很复杂,这样学源码才简单

当一个线程判断当前这个tab[i]节点是null的时候,但是还没有执行完下一句,这个时候另外一个线程也来了,他判断这个节点也是null,也执行下面那句话,那最终两个线程只能有一个数据能写进去,另一个就丢了。T1线程还没有完成数组的初始化工作,T2线程已经开始执行putVal()方法了,这个时候T2线程put进去的值还是T1线程初始化的那个数组吗?还是和上面的一样,HashTable就不说了,putVal()方法被synchronized了,里面所有的操作都是线程安全的,

2401_85131702的博客 1190

认真学习jdk1.7下ConcurrentHashMap的实现原理

HashMap无论是 1.7 还是 1.8 其实都能看出 JDK 没有对它做任何的同步操作,所以并发会出问题,甚至出现死循环导致系统不可用。这个问题就交给ConcurrentHashMap。 ConcurrentHashMap是一个 在juc包下的 map, 线程安全。 在jdk.1.8 之前采用数组+ 链表的结构 并且采用`分段锁机制` 来保证线程安全,而jdk1.8 改成了 数组+ 链表+ 红黑树,线程安全方面也改成了 `cas+ synchronized` 来保证线程安全。 **Concurre

小小默:进无止境 1480

ConcurrentHashMap 是如何保证线程安全的,你知道么?

点击下方“IT牧场”,选择“设为星标”blog.youkuaiyun.com/qq_41737716/article/details/9054984701、前言02、相关概念03、Amdahl定律04、初始化数据结构时的线程安全05、总结06、put操作的线程安全07、总结08、扩容操作的线程安全09、扩容时的get操作10、多线程协助扩容11、在什么情况下会进行扩容操作?12、总结...

ITMuch的专栏 1127

零基础理解ConcurrentHashMap的线程安全原理

作为刚接触多线程编程的新手,我最初被各种线程安全问题搞得头大,直到遇到这个神器才发现原来并发编程可以这么优雅。如果所有人共用一把钥匙(普通的HashMap),每次存取物品都要排队等前一个人用完,效率极低。而ConcurrentHashMap就像给每组柜子配独立钥匙(分段锁),不同区域的人可以同时存取,既安全又高效。特别是它的实时预览功能,可以清晰看到多线程操作时数据如何保持一致性,对理解原理特别有帮助。比如预计存放1000个元素,设置初始容量为1024(2的幂次)能减少扩容带来的锁竞争。

IndigoNight21的博客 836

线程安全的Map——Hashtable、SynchronizedMap、ConcurrentHashMap线程安全原理

本文简要介绍了线程安全的三个Map的底层数组结构及其实现原理,包括Hashtable、SynchronizedMap和ConcurrentHashMap

Isabella__的博客 1116
上一篇: eclipse反编译插件
下一篇: Eclipse使用Jacoco验证测试用例的代码覆盖率
封何
博客等级 码龄14年 13粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值