为什么 ConcurrentHashMap 中 key 不允许为null

考察目标
这是一个基础问题,主要考察 1 到 3 年经验的开发人员
ConcurrentHashMap 在实际应用中使用频率较高
考察这个问题的目的,是了解求职者的基本功。
所以为了表现更好,可以从 ConcurrentHashMap 的设计角度去回答。
问题解析
打开 ConcurrentHashMap 的源码
在 put 方法里面,可以看到这样一段代码(如图)
如果 key 或者 value 为空,则抛出空指针异常。
但是为什么 ConcurrentHashMap 不允许 key 或者 value 为空呢?
简单来说,就是为了避免在多线程环境下出现歧义问题。
所谓歧义问题,就是如果 key 或者 value 为 null,当我们通过 get(key)获取对应的 value
的时候,如果返回的结果是 null
我们没办法判断,它是 put(k,v)的时候,value 本身为 null 值,还是这个 key 本身就不
存在。
比如在这样一种情况下(如图),线程 t1 调用 containsKey 方法判断 key 是否存在,
假设当前这个 key 不存在,本来应该返回 false。
但是在 T1 线程返回之前,正好有一个 T2 线程插入了这个 key,但是 value 为 null。 这就导致原本 T1 线程返回的结果有可能是 true,有可能是 false,取决于 T1 和 T2 线 程的执行顺序
这种现象我们可以认为是线程安全性问题,而 ConcurrentHashMap 又是一个线程安
全的集合,
所以自然就不允许 key 或者 value 为 null。
而 HashMap 中是允许存 null 的,因为它不需要考虑到线程安全性问题。
所以这个问题的核心本质还是 ConcurrentHashMap 这个并发安全性集合的特性。
当然。Doug Lea 还认为,不管是否是并发安全的集合,它都不应该允许存储 null。
高手回答
好的。
ConcurrentHashMap 这么设计的原因是为了避免在多线程并发场景下的歧义问题。
也就是说,当一个线程从 ConcurrentHashMap 获取某个 key,如果返回的结果是 null
的时候。
这个线程无法确认,这个 null 表示的是确实不存在这个 key,还是说存在 key,但是
value 为空。
这种不确定性会造成线程安全性问题,而 ConcurrentHashMap 本身又是一个线程安
全的集合。
所以才这么设计!
以上就是我的理解。
摘自mic老师文档

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springcloud学生选课系统源码

开发技术: jdk1.8,mysql5.7,idea,nodejs,vscode springcloud springboot mybatis vue elementui 功能介绍: 学生: 登录,统计分析,选课(查看课程及选择&a…

Kubernetes Gateway API 攻略:解锁集群流量服务新维度!

Kubernetes Gateway API 刚刚 GA,旨在改进将集群服务暴露给外部的过程。这其中包括一套更标准、更强大的 API资源,用于管理已暴露的服务。在这篇文章中,我将介绍 Gateway API 资源,并以 Istio 为例来展示这些资源是如何关联的。通…

C++快速入门 - 2(几分钟让你快速入门C++)

C快速入门 - 2 1. 内联函数1.1 概念1.2 特性 2. auto关键字(C11)2.1 类型别名思考2.2 auto简介2.3 auto的使用细则2.4 auto不能推导的场景 3. 基于范围的for循环(C11)3.1 范围for的语法3.2 范围for的使用条件 1. 内联函数 1.1 概念 以inline修饰的函数叫做内联函数&#xff0c…

Oracle(2-4)Naming Method Configuration

文章目录 一、基础知识1、OV of Naming Methods 命名方法的OV2、Five Key Parameters 连接数据库的五个关键参数 二、基础操作1、tnsnames.ora网络名配置 Naming Method Configuration 数据库网络命名配置 目标1: 描述主机命名和本地服务名称解析之间的区别使用Orac…

适合学校或高校老师、学生学习用的网盘推荐

现代教育中,数字化的教学资源和家长的参与度越来越重要。然而文件传输的问题一直是学校和家长面临的一个挑战,网络限制、U盘病毒和文件管理不便等问题,都对教学质量和家校沟通造成了影响。Zoho WorkDrive企业网盘为学校还有教辅机构提供了一个…

使用activiti部署提示不是 ‘NCName‘ 的有效值

排查发现是整个流程图的,流程名称没有填写 修改之后就可以了

1445 雉兔同笼

Tint(input()) for i in range(T):s input().split()head int(s[0])foot int(s[1])rabbitfoot/2-headchicken2*head-foot/2if rabbit>0 and chicken>0 and rabbit.is_integer():print(int(chicken),int(rabbit))else:print(-1)

美容仪器经营小程序商城的作用如何

美容仪器可以包含剃须刀、微针仪、微晶笔等,除了美容美业机构需要外,在家庭中也有不小的需求,对产品经营商家来说除了满足客户线下订购的需求外,还需要线上拓展更广的客群及多场景客户在线消费。 入驻第三方平台是商家们首先考虑…

ITIL® 4 Foundation​,即将开课~想了解点击查看

ITIL 4 Foundation 即将开课~ 想报名的必须提前预约啦 👇👇👇 2 0 23 年 培训地点: 远程直播:线上平台学习 开课时间: 周末班:11月25日、26日; 什么是ITIL? 信息技…

Wireshark的数据包它来啦!

通过Wireshark工具,可以轻松的看到网卡的数据信息。通过Wireshark显示的数据包内容信息,通常分七栏,介绍一下: 1No.: 数据包编号。 2.Time Time显示时间,以1号数据包发生开始计时。 3.Source Source显示内容…

《活着》思维导图

今天给大家分享的这部作品的题目叫“活着”,作为一个词语,“活着”在我们中国的语言里充满了力量,它的力量不是来自于喊叫,也不是来自于进攻,而是忍受,去忍受生命赋予我们的责任,去忍受现实给予…

Vite - 配置 - 自动修改 index.html 中的title

需求描述 在Vue3项目的开发过程中,我们为了能区分正式环境和测试环境, 通常会进行环境配置文件的区分, 例如,开发环境一个配置文件、生产环境一个配置文件。因此,我们就希望 在项目的index.html 的 title 标签中&…

17.Oracle11g的PL/SQL基础

Oracle11g的PL/SQL基础 一、PL/SQL的体系1、什么是PL/SQL2、PL/SQL 的优缺点2.1 PL/SQL的优点2.2 PL/SQL的缺点 二、PL/SQL的语法1、PL/SQL代码结构(块)2、PL/SQL基本语法2.1 变量声明2.2 流程控制语法 三、oracle的动态SQL 一、PL/SQL的体系 1、什么是P…

广东网络广播电视台《明星小主播》栏目开拍 小主持神采奕奕

近日,由广东网络广播电视台的《明星小主播》栏目,在广东广播电视台(人民北路)广州越秀区人民北路686号主楼五楼火热开拍,幕后花絮曝光。《明星小主播》栏目是一档专业少儿主持类节目,节目旨在培养小朋友的主…

一次性能测试,为啥把我逼疯了?

最近,公司领导让我做下性能方面的竞品对比,作为一个性能测试小白的我,突然接到这样的任务,下意识发出大大的疑问。 整理好心情,内心想着“领导一定是为了考验我,才给我这个任务的”,开始了这一…

数据结构之栈的讲解

💕" 春宵一刻值千金,花有清香月有阴。 "💕 作者:Mylvzi 文章主要内容:leetcode刷题之哈希表的应用(1) 1.栈的概念 栈是一种只允许在一端(栈顶)进行数据操作的数据结构,具…

工作记录---淘宝双11,亿级流量高并发是怎么抗住?(站在巨人的肩膀上学习,超开心~)--------脚踏实地,持续学习(看完这一篇获益匪浅)

什么是分布式? 系统中的多个模块在不同服务器上部署,即可称为分布式系统。 如Tomcat和数据库分别部署在不同的服务器上,或两个相同功能的Tomcat分别部署在不同服务器上。 什么是高可用? 系统中部分节点失效时,其他节…

大数据基础设施搭建 - Kafka(with ZooKeeper)

文章目录 一、简介二、单机部署2.1 上传压缩包2.2 解压压缩包2.3 修改配置文件(1)配置zookeeper地址(2)修改kafka运行日志(数据)存储路径 2.4 配置环境变量2.5 启动/关闭2.6 测试(1)查看当前服务器中的所有…

米诺地尔行业分析:预计2029年将达到14亿美元

米诺地尔市场规模庞大,不仅包括消费品市场和服务行业,还涵盖了创新科技领域。随着经济的发展和市场需求的不断增长,米诺地尔市场的规模将继续扩大,各行各业都将面临更多机遇和挑战。 随着社会经济发展和城市化进程的推进&#xff…

怎么实现在微信公众号秒杀商品的功能呢

实现微信公众号秒杀商品的功能,需要结合微信公众平台和后端开发技术。下面将介绍整个实现过程,包括前期准备、开发流程和后期运营等方面。 一、前期准备 确定秒杀商品:选择适合秒杀的商品,要求数量充足、质量良好,同时…