这篇具有很好参考价值的文章主要介绍了为什么 ConcurrentHashMap 中 key 不允许为 null。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。
ConcurrentHashMap
在ConcurrentHashMap 的源码,在 put 方法里面,可以看到这样一段代码,如果 key 或者 value 为空,则抛出空指针异常。
但是为什么 ConcurrentHashMap 不允许 key 或者 value 为空呢? 文章来源地址https://www.toymoban.com/news/detail-724059.html
原因
简单来说,就是为了避免在多线程环境下出现歧义问题。所谓歧义问题,就是如果 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。
文章来源:https://www.toymoban.com/news/detail-724059.html
到了这里,关于为什么 ConcurrentHashMap 中 key 不允许为 null的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!