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的地方。

目录
相关文章
|
Linux Python Windows
Python3, 多种方法实现文件/目录的监听,只想说一个字:泰裤辣。
Python3, 多种方法实现文件/目录的监听,只想说一个字:泰裤辣。
70 0
奇怪的“可以复制 不能粘贴”问题
奇怪的“可以复制 不能粘贴”问题
|
算法
GSEA会用了,来了解下DGSEA?
差异基因集富集分析(DGSEA)是对Broad Institute / MIT的原始的Gene Set Enrichment Aanlysis(GSEA)分析算法的改进。它是一种用来确定输入基因集在两种生物通路之间是否显示出统计学上差异计算方法。
140 0
|
JavaScript 安全 前端开发
这个key我查了,没问题
这是个 Vue 项目, 当看到这个 TypeError: Cannot read properties of undefined(reading 'key') 这行报错的时候,我的第一反应是 v-for 绑定的 key 有问题。
1339 0
这个key我查了,没问题
|
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
明明打印到文件了,为啥tail -f看不到
文章《一分钟了解nohup和&的功效》留了一个“nohup.out为啥没有包含stdout输出”的尾巴,今天把坑填了。
1073 0