CourrentHashMap 为啥不能存为空的value

简介: CourrentHashMap 为啥不能存为空的value

Doug Lea   道格.利   java.concurrent.util   juc  Java并发包    JSR-166

Josh Bloch  是 《effective Java》 书的作者,Java集合框架的创始人

1、

所以当map.get(key)返回的值是null,在HashMap中虽然存在二义性,但是结合containsKey方法可以避免二义性。

2、

但是如果是ConcurrentHashMap呢?它的使用场景是多线程的情况下。我们还是用反证法来推理,假设concurrentHashMap允许存放值为null的value。

这时有A、B两个线程。

线程A调用concurrentHashMap.get(key)方法,返回为null,我们还是不知道这个null是没有映射的null还是存的值就是null。

我们假设此时返回为null的真实情况就是因为这个key没有在map里面映射过。那么我们可以用concurrentHashMap.containsKey(key)来验证我们的假设是否成立,我们期望的结果是返回false。

但是在我们调用concurrentHashMap.get(key)方法之后,containsKey方法之前,有一个线程B执行了concurrentHashMap.put(key,null)的操作。那么我们调用containsKey方法返回的就是true了。这就与我们的假设的真实情况不符合了。

这就是Doug说的在两次调用的过程中值是可能变化的(the map might have changed between calls.)。这就是Doug所要表达的二义性。

Doug给出的建议是:可以试一试在某个地方声明static final Object NULL=new Object(),然后用NULL替换掉所有用null的地方。

目录
相关文章
|
6月前
|
C语言 索引
一堆数组程序
一堆数组程序
24 0
|
Linux Python Windows
Python3, 多种方法实现文件/目录的监听,只想说一个字:泰裤辣。
Python3, 多种方法实现文件/目录的监听,只想说一个字:泰裤辣。
70 0
|
3月前
|
人工智能 Java 容器
十个Java字符串操作示例程序
十个Java字符串操作示例程序
30 1
|
11月前
|
Cloud Native Go Windows
兄弟 Goland 咱能一次性将注释设置好不
兄弟 Goland 咱能一次性将注释设置好不
|
算法
GSEA会用了,来了解下DGSEA?
差异基因集富集分析(DGSEA)是对Broad Institute / MIT的原始的Gene Set Enrichment Aanlysis(GSEA)分析算法的改进。它是一种用来确定输入基因集在两种生物通路之间是否显示出统计学上差异计算方法。
141 0
|
存储 JavaScript 前端开发
手撕前端面试题【javascript~文件扩展名、分隔符、单向绑定、判断版本、深浅拷贝、内存泄露等】
手撕前端面试题【javascript~文件扩展名、分隔符、单向绑定、判断版本、深浅拷贝、内存泄露等】
246 0
手撕前端面试题【javascript~文件扩展名、分隔符、单向绑定、判断版本、深浅拷贝、内存泄露等】
|
Java Spring 容器
读源码,我们可以从第一行读起
读源码,我们可以从第一行读起
187 0
|
PHP
PHP面试题:请写一段程序,在服务器创建一个文件fruit.dat,将试题3中得到的数组写入到改文件中,然后写一段程序从文件中读取并还原数组@author zhuwenqiong
PHP面试题:请写一段程序,在服务器创建一个文件fruit.dat,将试题3中得到的数组写入到改文件中,然后写一段程序从文件中读取并还原数组@author zhuwenqiong
131 0
|
API vr&ar 图形学
【Unity3D 灵巧小知识点】 ☀️ | 字符串截取,截取某个路径字符串中 末尾文件 的名字
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。
|
C++
VS代码中明明有NO_BITMAP字串,提示找不到
VS代码中明明有NO_BITMAP字串,提示找不到
85 0