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

目录
相关文章
|
存储 JavaScript Linux
OSS传输工具OSSutil使用介绍
本篇文章我们重点讲述一下传输工具Ossutil的使用: 若文件总量小于30T则建议使用ossutil,若大于30T建议使用
30781 1
|
存储 SQL 数据库连接
Seata常见问题之修改大小如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
614 0
|
存储 算法
【堆】数据结构堆的实现(万字详解)
【堆】数据结构堆的实现(万字详解)
640 0
|
SQL 存储 关系型数据库
MySQL修改表结构到底会不会锁表?
DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。 常用的语句关键字主要包括 create、drop、alter 等。 DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性。 常用的语句关键字主要包括 insert、delete、udpate 和 select 等。(增删改查) DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了
3134 0
MySQL修改表结构到底会不会锁表?
|
网络协议 网络架构
网络TCP/IP基础(IP地址网络汇总与规划)
网络汇总、汇总方法、汇总案例、要求、过程、其它方法、注意事项、汇总扩展、IP地址规划及应用、IP地址规划的案例、规划原则、规划案例、规划过程、注意事项、IP地址规划的应用、规划应用案例、规划思路、规划应用过程、其它规划
1537 1
网络TCP/IP基础(IP地址网络汇总与规划)
|
存储 Java Nacos
Seata常见问题之springboot 2.3.7 和高版本 seata 2.0.0,1.6.1不兼容如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
1555 0
|
Ubuntu 定位技术 API
python 通过图片(原图)精确获取图片拍摄的位置,时间,设备等信息
python 通过图片(原图)精确获取图片拍摄的位置,时间,设备等信息
python 通过图片(原图)精确获取图片拍摄的位置,时间,设备等信息
|
12月前
|
存储 JSON NoSQL
解决Redis的键值前出现类似\xAC\xED\x00\x05t\x00*这样的字符序列
遇到Redis键值前出现Java序列化字符序列的问题,主要通过调整序列化策略来解决,首选 `StringRedisTemplate`或自定义序列化器来确保数据以预期的格式存储。合理的序列化策略不仅能提高数据的可读性和存储效率,还能避免潜在的安全隐患,是构建健壮Redis应用的基础之一。
1088 2
|
11月前
|
安全 前端开发 JavaScript
利用HTTP协议进行文件上传和下载的常见方法
【10月更文挑战第25天】可以利用HTTP协议方便地实现文件的上传和下载功能,满足不同应用场景下的需求。在实际应用中,还可以根据具体的业务需求和安全要求,对文件上传和下载的过程进行进一步的优化和安全处理。
|
Python
SyntaxError :invalid syntax错误解决办法
SyntaxError :invalid syntax错误解决办法
3631 1