为什么 ConcurrentHashMap 中 key 不允许为null

news2024/11/17 13:27:05
考察目标
这是一个基础问题,主要考察 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.coloradmin.cn/o/1234001.html

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

相关文章

基于C#实现协同推荐 SlopeOne 算法

一、概念 相信大家对如下的 Category 都很熟悉,很多网站都有类似如下的功能,“商品推荐”,"猜你喜欢“,在实体店中我们有导购来为我们服务,在网络上我们需要同样的一种替代物,如果简简单单的在数据库里面去捞&am…

CTF-栈溢出-基本ROP-【ret2syscall】

文章目录 ret2syscallBxMCTF 2023 Anti-Libcmainwrite_bufflush_obufreadintread_buf 思路exp ret2syscall 即控制程序执行系统调用,获取 shell。 BxMCTF 2023 Anti-Libc main write_buf 写入字符的,待会输出 flush_obuf 把字符输出到屏幕 read…

集群创建(flannel)时候,没有自动创建出cni0网卡

给旧的集群加入四台新的服务器启动时候发现都是正常的,但是pod通信报错 集群通信失败,第一时刻想看看是不是cni0和flannel.1的网段是不是通的,点进去一看发现cni0网卡没有生成。 部署是通过kubeadm方式部署的集群,目前有两种解决…

mysql8 group by出错:this is incompatible with sql_mode=only_full_group_by

第一步:先检查自己windows电脑上有没有my.ini文件,没有则创建一个my.ini 第二步:将下面内容复制进入my.ini保存,重启Mysql即可 [mysqld] sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,…

请求的接口响应状态为已取消的原因

有趣的iframe问题 今天遇到一个问题,当点击了按钮----跳转页面时----F12键点击网络中的状态报了已取消,类型是 document说明是前端页面的问题,如果是xhr那可能是接口的问题。 原本是写了3个iframe,页面刷新的时候请求了第一个iframe,然后就…

android生成jks文件

jks文件用来校验微信支付 生成的方法:

论文《A recurrent latent variable model for sequential data》笔记:详解VRNN

A recurrent latent variable model for sequential data 背景 1 通过循环神经网络的序列建模 循环神经网络(RNN)可以接收一个可变长度的序列 x ( x 1 , x 2 , . . . , x T ) x (x_1, x_2, ..., x_T) x(x1​,x2​,...,xT​)作为输入,并通…

install安装路径设定

因为安装路径的前缀 CMAKE_INSTALL_PREFIX 都在外面都写了。 所以在具体的dll 在安装时,就写相对路径就行了。

基于51单片机交通灯仿真_紧急开关+黄灯倒计时+可调时间(proteus+代码+报告+讲解视频)

基于51单片机交通灯_紧急开关黄灯倒计时可调时间 ☑️开题报告☑️仿真图(提供源文件):☑️系统硬件设计☑️主控制器选择☑️系统硬件结构图☑️时钟及复位电路☑️指示灯及倒计时模块 ☑️倒计时模块:☑️程序☑️软件主流程框架…

PPT画饼不能信,那现场连数据生成BI报表呢?

PPT说的天花乱坠,不如真正地看到、体验到BI报表效果,眼见为实!奥威BI大数据分析工具推出的这套BI方案就将真实的BI报表效果搬到了BI选型会议上了,可以让业务人亲自上手体验三步完成BI报表分析的过程。 只需三步,立即生…

对比学习15篇顶会论文及代码合集,2023最新

对比学习(contrastive learning)是现在无监督学习中一种常用的学习机制,它可以在没有标签的数据上进行学习,避免依赖大量标签数据,从而帮助我们更好地理解和利用数据集中的信息,提高模型的性能和表现。 作…

Java 开源重试类 guava-retrying 使用案例

使用背景 需要重复尝试执行某些动作&#xff0c;guava-retrying 提供了成型的重试框架 依赖 <dependency><groupId>com.github.rholder</groupId><artifactId>guava-retrying</artifactId><version>${retrying.version}</version>…

python tkinter 使用

python tkinter 使用 ython可以使用多种GUI库来创建窗口页面&#xff0c;例如Tkinter、PyQt、wxPython等。 本篇文章主要讲述如何使用tkinter。 1&#xff1a;导入 import tkinter as tk这时如果运行的话会提示&#xff1a; ModuleNotFoundError: No module named ‘tkint…

小趴菜教你如何用Python开发手机App..

Python语言虽然很万能&#xff0c;但用它来开发app还是显得有点不对路&#xff0c;因此用Python开发的app应当是作为编码练习、或者自娱自乐所用&#xff0c;加上目前这方面的模块还不是特别成熟&#xff0c;bug比较多&#xff0c;总而言之&#xff0c;劝君莫轻入。 准备工作 …

Rust错误处理机制:优雅地管理错误

大家好&#xff01;我是lincyang。 今天&#xff0c;我们要探讨的是Rust语言中的错误处理机制。 Rust作为一种系统编程语言&#xff0c;对错误处理的重视程度是非常高的。它提供了一套既安全又灵活的机制来处理可能出现的错误。 Rust错误处理的两大类别 在Rust中&#xff0…

酒店品牌纷纷冲击中高端,东呈集团能否“快人一步”?

过去两年酒店行业加速洗牌&#xff0c;“强者恒强”的马太效应正持续凸显。 报告显示&#xff0c;2022年排名前10名的酒店集团分别为锦江国际、华住、首旅如家、格林、东呈集团、尚美数智、亚朵、德胧、逸柏、都市酒店。以上10家酒店集团客房规模在连锁酒店市场占有率为62.36&…

同星智能完成A+轮超亿元融资,国投招商领投

2023年10月&#xff0c;上海同星智能科技有限公司成功完成超亿元A轮融资。本轮融资由国投招商管理的先进制造产业投资基金二期领投&#xff0c;老股东丰年资本超额跟投。 本轮融资将用于产品研发和全球化市场拓展。 同星智能成立于2017年&#xff0c;一直专注于研发国产自主可控…

docker-compose安装harbor

docker-compose安装harbor 环境&#xff1a;centos7 1、安装docker 官方文档 https://docs.docker.com/engine/install/centos/ 1、卸载旧版本 $ sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate …

02【SpringBoot静态处理、错误处理】

目录 一、SpringBoot的WEB开发 1.1 静态资源的处理 1.1.1 静态资源目录 1&#xff09;SpringBoot静态资源处理 2&#xff09;关于静态资源处理的配置 3&#xff09;欢迎页面的处理 4&#xff09;修改SpringBoot资源访问路径 1.1.2 WebJars资源 1.2 注册Servlet三大组件…

渗透实例------2个星期艰难的渗透纪实

2个星期艰难的渗透纪实 kyo327 入侵原因,需删一帖子,目标用www.111.com代替,前期通过初期的网站文件暴力猜解,扫描到robots.txt这个文件,有以下目录。如图1: 图1 再通过对这些文件的访问,从3gadm.php文件的标题栏得到该网站采用的是diy-page8.3的cms,自然可以先用搜索…