码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 为什么 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老师文档
  • 相关阅读:
    欧洲fba海运详解:欧洲fba海运怎么样?有哪些优势?
    GO安装以及配置(1)
    虹科示波器 | 汽车免拆检修 | 2021款广汽丰田威兰达PHEV车发动机故障灯异常点亮
    免费下载缺失的DLL文件
    Spring事务this自调用的理解误区?真的会让事务失效吗?
    uniapp 网络请求封装(uni.request 与 uView-Plus)
    Edge被2345浏览器劫持 解决方法
    IT从业者的冥想入门指南(精简版)
    STM32 ~ GPIO不同模式之间的区别与实现原理
    第二好PyTorch新手课程;论文写作指南;使用µGo语言开发迷你编译器;超高效使用Transformer的扩展库;前沿论文 | ShowMeAI资讯日报
  • 原文地址:https://blog.csdn.net/qq_42362007/article/details/134530009
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号