Java的ConcurrentHashMap中不能存储null的原因解析

 更新时间:2022年07月20日 10:03:27   作者:哪 吒  
众所周知,在Java中Map可以存储null,而ConcurrentHashMap不能存储null值,那么为什么呢?今天通过源码分析给大家详细解读,感兴趣的朋友一起看看吧

众所周知,在Java中Map可以存储null,而ConcurrentHashMap不能存储null值,那么为什么呢?

一、先出源码出发

put方法点进去~

@throws NullPointerException if the specified key or value is null and this map does not permit null keys or values

可以清晰的看到源码中规定,ConcurrentHashMap是不可以存储null值的。

二、那么究竟这是为什么呢?

可以先具体的了解一下ConcurrentHashMap。

与HashMap一样,ConcurrentHashMap也是一个基于散列的Map,但它使用了一种完全不同的加锁策略来提供更高的并发性和伸缩性。ConcurrentHashMap并不是将每个方法都在同一个锁上同步并使得每次只能有一个线程访问容器,而是使用一种更细的加锁机制来实现更大程度的共享,这种机制成为分段锁。在这种机制中,任意数量的读取线程可以并发地访问Map,执行读取操作的线程和执行写入操作的线程可以并发地访问Map,并且一定数量的写入线程可以并发地修改Map。ConcurrentHashMap带来的结果是,在并发访问环境下将实现更高的吞吐量,而在单线程环境中只损失非常小的性能。

ConcurrentHashMap返回的迭代器具有弱一致性,而并非“及时失败”。弱一致性的迭代器可以容忍并发的修改,当创建迭代器时会遍历已有的元素,并可以在迭代器被构造后将修改操作反映给容器。ConcurrentHashMap返回的迭代器具有弱一致性,而并非“及时失败”。弱一致性的迭代器可以容忍并发的修改,当创建迭代器时会遍历已有的元素,并可以在迭代器被构造后将修改操作反映给容器。

三、ConcurrentHashMap 作者 Doug Lea 的邮件

对于 ConcurrentHashMap 不允许插入 null 值的问题,有人问过 ConcurrentHashMap 的作者 Doug Lea,以下是他回复的邮件内容:

The main reason that nulls aren’t allowed in ConcurrentMaps
(ConcurrentHashMaps, ConcurrentSkipListMaps) is that ambiguities that
may be just barely tolerable in non-concurrent maps can’t be
accommodated. The main one is that if map.get(key) returns null, you
can’t detect whether the key explicitly maps to null vs the key isn’t
mapped.In a non-concurrent map, you can check this via
map.contains(key),but in a concurrent one, the map might have changed
between calls.Further digressing: I personally think that
allowingnulls in Maps (also Sets) is an open invitation for programsto
contain errors that remain undetected untilthey break at just the
wrong time. (Whether to allow nulls evenin non-concurrent Maps/Sets is
one of the few design issues surroundingCollections that Josh Bloch
and I have long disagreed about.)It is very difficult to check for
null keys and valuesin my entire application .Would it be easier to
declare somewherestatic final Object NULL = new Object();and replace
all use of nulls in uses of maps with NULL?

-Doug

以上信件的主要意思是,Doug Lea 认为这样设计最主要的原因是:不容忍在并发场景下出现歧义!

到此这篇关于Java的ConcurrentHashMap中不能存储null的原因解析的文章就介绍到这了,更多相关Java ConcurrentHashMap不能存储null内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IntelliJ IDEA本地代码提交到github网站不显示与本地不同步问题的解决办法

    IntelliJ IDEA本地代码提交到github网站不显示与本地不同步问题的解决办法

    今天小编就为大家分享一篇关于IntelliJ IDEA本地代码提交到github网站不显示与本地不同步问题的解决办法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • 用SpringBoot+Vue+uniapp小程序实现在线房屋装修管理系统

    用SpringBoot+Vue+uniapp小程序实现在线房屋装修管理系统

    这篇文章主要介绍了用SpringBoot+Vue+uniapp实现在线房屋装修管理系统,针对装修样板信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题开发了这套系统,需要的朋友可以参考下
    2023-03-03
  • Java实现分布式系统限流

    Java实现分布式系统限流

    这篇文章主要为大家详细介绍了Java实现分布式系统限流,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • java异或加密算法

    java异或加密算法

    这篇文章主要介绍了java异或加密算法,有需要的朋友可以参考一下
    2013-12-12
  • Java数据结构学习之栈和队列

    Java数据结构学习之栈和队列

    这篇文章主要介绍了Java数据结构学习之栈和队列,文中有非常详细的代码示例,对正在学习java的小伙伴们有一定的帮助,需要的朋友可以参考下
    2021-05-05
  • 求1000阶乘的结果末尾有多少个0

    求1000阶乘的结果末尾有多少个0

    题目是:求1000!的结果末尾有多少个0,解题思路:两个素数2、5,相乘即可得到10,我们可以认为,有多少组2、5,结尾就有多少个0,下面是代码,需要的朋友可以参考下
    2014-02-02
  • btrace定位生产故障的方法示例

    btrace定位生产故障的方法示例

    这篇文章主要介绍了btrace定位生产故障的方法示例,文中通过示例代码介绍的很详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-02-02
  • IDEA 热部署设置(JRebel插件激活)

    IDEA 热部署设置(JRebel插件激活)

    这篇文章主要介绍了IDEA 热部署设置(JRebel插件激活),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Elasticsearch mapping 概念及自动创建示例

    Elasticsearch mapping 概念及自动创建示例

    这篇文章主要为大家介绍了Elasticsearch mapping 概念及自动创建示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • mall整合SpringSecurity及JWT实现认证授权实战

    mall整合SpringSecurity及JWT实现认证授权实战

    这篇文章主要为大家介绍了mall整合SpringSecurity及JWT实现认证授权实战示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论