ConcurrentHashmap

ConcurrentHashMap扩容 三种触发方式达到了扩容的阈值。 阅读详情

先来看看 1.7 的实现,下面是他的结构图:

原理上来说:ConcurrentHashMap 采用了分段锁技术,其中 Segment 继承于 ReentrantLock。不会像 HashTable 那样不管是 put 还是 get 操作都需要做同步处理,理论上 ConcurrentHashMap 支持 CurrencyLevel (Segment 数组数量)的线程并发。每当一个线程占用锁访问一个 Segment 时,不会影响到其他的 Segment。

再结合图看看 put 的流程。

 

  1. 将当前 Segment 中的 table 通过 key 的 hashcode 定位到 HashEntry。

  2. 遍历该 HashEntry,如果不为空则判断传入的 key 和当前遍历的 key 是否相等,相等则覆盖旧的 value。

  3. 不为空则需要新建一个 HashEntry 并加入到 Segment 中,同时会先判断是否需要扩容。

  4. 最后会解除在 1 中所获取当前 Segment 的锁。

 

get 逻辑比较简单:

  1. 只需要将 Key 通过 Hash 之后定位到具体的 Segment ,再通过一次 Hash 定位到具体的元素上。

  2. 由于 HashEntry 中的 value 属性是用 volatile 关键词修饰的,保证了内存可见性,所以每次获取时都是最新值。

    ConcurrentHashMap 的 get 方法是非常高效的,因为整个过程都不需要加锁。

1.8

1.7 已经解决了并发问题,并且能支持 N 个 Segment 这么多次数的并发,但依然存在 HashMap 在 1.7 版本中的问题。

看起来是不是和 1.8 HashMap 结构类似?

其中抛弃了原有的 Segment 分段锁,而采用了 CAS + synchronized 来保证并发安全性。

也将 1.7 中存放数据的 HashEntry 改为 Node,但作用都是相同的。

其中的 val next 都用了 volatile 修饰,保证了可见性。

 

1.8 在 1.7 的数据结构上做了大的改动,采用红黑树之后可以保证查询效率(O(logn)),甚至取消了 ReentrantLock 改为了 synchronized,这样可以看出在新版的 JDK 中对 synchronized 优化是很到位的。

准确率、召回率、f1指标计算的区别 准确率是模型正确预测的样本占总样本的比例。 阅读详情

相关推荐

从零开始掌握Python机器学习:七步教程 基础篇

前言 「开始」往往是最难的,尤其是当选择太多的时候,一个人往往很难下定决定做出选择。本教程的目的是帮助几乎没有 Python 机器学习背景的新手成长为知识渊博的实践者,而且这个过程中仅需要使用免费的材料和资源即可。 第一步:基本 Python 技能 如果我们打算利用 Python 来执行机器学习,那么对 Python 有一些基本的了解就是至关重要的。 首先,你需要安装 Python。因为我们后...

hcgx2018的博客 1613

Java8 ConcurrentHashMap详解

Java8 ConcurrentHashMapJava7 中实现的 ConcurrentHashMap 说实话还是比较复杂的,Java8 对 ConcurrentHashMap 进行了比较大的改动。建议读者可以参考 Java8 中 HashMap 相对于 Java7 HashMap 的改动,对于 ConcurrentHashMap,Java8 也引入了红黑树。说实话,Java8 Concurrent

好好学java 4万+

嵌入式系统(一):鸿蒙系统

本文为期末复习笔记,内容仅供参考???? 鸿蒙系统是一款面向万物互联时代的、全新的分布式操作系统 鸿蒙提出了基于同一套系统能力、适配多种终端形态的分布式理念 提供全场景(移动办公、运动健康、社交通信、指挥出行、媒体娱乐等)业务能力 华为是OpenHarmony开源项目的共建者、也是共享者之一 鸿蒙技术特性 分布式设计 一次开发,多端部署 系统与硬件解耦,弹性部署 三大分布式能力 分布式软总线 设备间互联互通提供分布式通信能力 从手动发现,进化成自发现 传输高带宽关键技术-极简协议 分布式数据管

weixin_45608532的博客 4307

ConcurrentHashMap

这是为了观察 e 节点和 next 节点的状态,Thread-0 单步执行到 594 行,再 594 处再添加一个断点(条件Thread.currentThread().getName().equals(“Thread-0”))这时可以在 Variables 面板观察到 e 和 next 变量,使用 view as -> Object 查看节点状态。get 时并未加锁,用了 UNSAFE 方法保证了可见性,扩容过程中,get 先发生就从旧表取内容,get 后发生就从新表取内容。

shall_zhao的博客 1223

芯片封装、功率密度提升及热管理系统优化三个维度分析高功率芯片散热技术挑战

本文探讨高功率芯片散热技术挑战与创新。随着新能源汽车MOSFET用量增至400颗/车,文章聚焦封装技术创新(双面散热、集成模块)、功率密度提升(SGT-MOSFET优化)和热管理系统协同优化三大方向。通过热仿真案例(如CPO散热优化)展示温升改善方案,强调需协同器件级设计、系统级仿真与先进封装技术(混合键合/玻璃基板)来解决高密度互连与散热矛盾,为功率密度跃升提供技术支撑。

莱歌数字的博客 1473

FPGA纯Verilog实现I²C主机控制器与EEPROM读写

I²C是一种广泛应用的同步串行总线协议,用于连接微控制器与EEPROM、传感器等低速外设。其核心原理包括开漏结构、主从通信机制、START/STOP时序及ACK/NACK应答流程。技术价值在于硬件资源占用少、布线简洁、支持多从机扩展,特别适合FPGA嵌入式系统中轻量级外设控制。典型应用场景涵盖工业数据存储、配置参数持久化及实时传感器接口。本文基于Xilinx Spartan-6 FPGA,采用纯Verilog HDL实现参数化I²C主机控制器与AT24C02 EEPROM读写验证,深入解析状态机设计、SDA

weixin_33557333的博客 119

ConcurrentHashMap杂谈

为什么使用ConcurrentHashMap 在并发编程中使用HashMap可能导致程序死循环,而使用线程安全的HashTable效率又非常低下 线程不安全的HashMap 在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100% 死循环案例: final HashMap<String, String> map = new HashMap<String, String>(2); Thread t = new Thread(new Runn

qq_46153765的博客 5776

HyperLynx(十四)高级分析技术

如果没有查找到该模型,可使用菜单命令“Setup”→“Options”→“Directories”,打开“Set Directories”对话框,单击“Edit”按钮,在“Select Directories for IC-Model Files”对话框中将路径“…在“Assign Models”对话框中的“Port”栏找到“OUTM”端口,在其对应的“Circuit Connection”栏中选择“txout”项。将端口R75连接到“Gnd”。同样,将“EMP”连接到“V”,完成预加重设置。...

小幽余生不加糖 4948

从ConcurrentHashMap看锁优化思路

我想,聊ConcurrentHashMap一定离不开并发,我们都知道他是为了解决HashMap的并发安全问题而生,那你有没有想过,我们在背八股的时候,都说HashTable和HashMap最大的不同便是HashTable是线程安全的,那么为什么要有ConcurrentHashMap?留下这个思考后,我们来想,造成并发安全的原因是什么?是不是不同线程同时对共享内存的访问,即我们需要一种手段来保证并发的安全性。

sbysgysby的博客 2099

机床上位机实战:CNC设备数据采集+工艺参数存储全流程(附C#代码+SQL设计)

如果能正常输出转速和状态,说明通信通了——这步是基础,没通的话别往下走,先查CNC的IP对不对、Modbus功能有没有开、地址是不是错了(我当初卡了2小时,发现是Fanuc的Modbus从站地址设成了2,不是默认1)。这篇文章就把整个开发过程拆透:从CNC通信协议选型,到数据采集代码落地,再到工艺参数的数据库设计,连中间踩过的“Fanuc系统寄存器地址对应错”“断连后数据补传”这些坑都给大家说清楚,新手跟着做也能跑通。工艺参数要跟“工单”和“设备”绑定,不然查的时候不知道是哪个工单、哪台设备的参数。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 792

ESP-IDF OTA升级过程中遇到的“esp_transport_read returned:-1 and errno:128”问题(4)

ESP-IDF OTA升级过程中遇到的“esp_transport_read returned:-1 and errno:128”问题(4)

phmatthaus的专栏 1532

HashMap和ConcurrentHashMap

特性HashMap线程安全性非线程安全,必须手动同步线程安全,内建并发控制机制锁机制无锁机制,需要外部同步使用分段锁或其他细粒度锁Null 键和值允许一个null键,多个null值不允许null键或null值迭代器Fail-fast弱一致性迭代器,可以并发修改性能在单线程中较快,线程不安全在高并发环境下性能更好并发操作需要外部同步机制支持高并发操作,线程间并发无锁竞争适用场景单线程,手动同步的多线程高并发的多线程环境适合在多线程环境下使用,而HashMap。

qq_45884192的博客 1264

B3640 T3 句子反转

要求将这些单词倒序输出。而且对于每个单词,如果是小写词,应当转为大写;如果是大写词,应当转为小写;如果是自然数,应该倒转输出。给定一行句子,每个词之间用空格隔开,要么是全小写英文单词,要么是全大写英文单词,要么是自然数。第一次做的时候0分,两个小时没做出来。仅一行,表示程序对句子的处理结果。仅一行,即需要反转的句子。

小前日记 366

ConcurrentHashMap是弱一致性分析

本文将用到Java内存模型的happens-before偏序关系(下文将简称为hb)以及ConcurrentHashMap的底层模型相关的知识。happens-before相关内容参见:JLS §17.4.5. Happens-before Order、深入理解Java内存模型以及Happens before;ConcurrentHashMap的详细介绍以及底层原理见深入分析ConcurrentHa

wzq6578702的专栏 7756

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

剖析 ConcurrentHashMap 源码

本文深入剖析了Java并发容器ConcurrentHashMap的核心设计思想与实现机制。首先,通过分析ConcurrentMap接口的原子操作方法及其CAS语义实现,揭示了无锁编程模式的设计理念;其次,详细解读了ConcurrentHashMap的关键实现,包括分段计数、树化/退化机制、特殊节点处理等技术,展示了其如何通过分层锁策略(空桶CAS+非空桶synchronized)实现高并发;重点解析了sizeCtl控制变量和扩容机制,阐明了多线程协作扩容的智能调度算法,包括扩容标记生成、线程计数管理。

lifallen的博客 2086

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

ConcurrentHashMap CAS 详解

ConcurrentHashMap CAS 详解

T_Y_F_的博客 1640

Camera2Demo

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

ConcurrentHashMap介绍

红黑树是一种特殊的平衡二叉树,首选具备了平衡二叉树的特点:左子树和右子数的高度差不会超过1,如果超过了,平衡二叉树就会基于左旋和右旋的操作,实现自平衡。每个节点必须是红色或者黑色。根节点必须是黑色。如果当前节点是红色,子节点必须是黑色所有叶子节点都是黑色。从任意节点到每个叶子节点的路径中,黑色节点的数量是相同的。当对红黑树进行增删操作时,可能会破坏平衡或者是特性,这是红黑树就需要基于左旋、右旋、变色来保证平衡和特性。

优快云博客 2047

ConcurrentHashMap的put与get解析

众所周知,常用的HashMap不是线程安全的;在多线程场景下,为保证线程安全与效率,一般使用ConcurrentHashMap。本文对ConcurrentHashMap的put与get方法作了深入解析,作分享给大家

Romantic-HaShiQi的博客 1744

ConcurrentHashMap详解

ConcurrentHashMap是Java中的线程安全哈希表实现,在JDK 1.8进行了重大优化。它采用Node数组+红黑树+CAS的混合结构,通过细粒度锁(synchronized桶头节点)和无锁操作(CAS)实现高并发。读操作无锁,写操作仅锁定单个桶,支持并发扩容和多线程协同迁移数据。当链表长度超过阈值(默认8)时会转为红黑树,提升查询效率。相比JDK 1.7的分段锁设计,1.8版本锁粒度更细,性能更高,适合高并发场景下的缓存、计数器等应用。

xinzhiyishi的博客 1261

深入理解ConcurrentHashMap

concurrentHashMap是一个支持高并发更新与查询的哈希表(基于HashMap)。hashtable该类不依赖于synchronization去保证线程操作的安全。Collections.synchronizedMap()也可以将map转成线程安全的。而concurrentHashMap在保证安全的前提下,进行get不需要锁定。HashTable: 使用了synchronized关键字对put等操作进行加锁;ConcurrentHashMap JDK1.7: 使用分段锁机制实现;

SevenCoding的博客 1298

HashMap 与 ConcurrentHashMap

size:是HashMap中实际存在的键值对数量。注意,size与 table数组的长度length是不一样的。(也叫 哈希数组、哈希槽位 数组、散列表)。Node类作为HashMap中的一个内部类,每个 Node 包含了一个 key-value 键值对。其中的next属性就是在哈希冲突之后,使用链地址法解决哈希冲突。如下图所示,散列表(table桶数组)中的每个元素就是一个Node。散列表(table桶数组)的长度length(Capacity)默认值是16。

longlongqin的博客 1037

ConcurrentHashMap 源码解读

全网最详细最全面的 ConcurrentHashMap 源码解读。和大家一起深入浅出的学习 JDK8 中的源码

CodeSuc 的技术博客 934

ConcurrentHashMap图文源码解析

同HashMap一样,Segment包含一个HashEntry数组,数组中的每一个HashEntry既是一个键值对,也是一个链表的头节点。Size方法的目的是统计ConcurrentHashMap的总元素数量, 自然需要把各个Segment内部的元素数量汇总起来。数组中的每一个Entry元素,又是一个链表的头节点。但是,如果在统计Segment元素数量的过程中,已统计过的Segment瞬间插入新的元素,这时候该怎么办呢?Segment的写入是需要上锁的,因此对同一Segment的并发写入会被阻塞。

echola_mendes的博客 1349

ConcurrentHashMap和HashMap的区别

【代码】ConcurrentHashMap和HashMap的区别。

mhz2977170的博客 1350
上一篇: 我终于搞懂了字符串常量池、运行时常量池、Class常量池
下一篇: Windows基础指令
Renaissance14th
博客等级 码龄9年 39粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值