自学内容网 自学内容网

HashMap的key,value都可以为null,ConcurrentHashMap的key,value都不能为null

探讨这个问题,我们先要知道HashMap和ConcurrentHashMap的使用场景,我们都知道HashMap是线程不安全的,一般不会用于多线程场景下;而ConcurrentHashMap是线程安全的,多用于多线程场景下。

源码拦截了

在这里插入图片描述

ConcurrentHashMap多线程场景下的二意性

我们先讨论value为啥不能为null,我们做个假设,假设ConcurrentHashMap支持value为null

String value = concurrentHashMap.get(key)

此时value返回为null,我们是不知道是由于key不存在导致返回null,还是本来value就是null,此处就有二义性了。
此时有人就会疑惑HashMap也会存在这个问题呀,但是HashMap可以通过containsKey来确认返回null是key不存在还是本来就是null(单线程场景)
而多线程情况下,ConcurrentHashMap中的value不能为null,证明如下:

有A、B两个线程。

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

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

但是在A调用concurrentHashMap.containsKey(key)后,值返回前,B线程设置concurrentHashMap.put(key,null),此时其实A调用的concurrentHashMap.containsKey(key)的结果应该是true,但是返回的是false。
故concurrentHashMap.containsKey(key)没法解决多线程下存在的二意性问题。

ConcurrentHashMap为啥key不能为null

翻阅很多文档后,并没有找到满意的答案,我理解就是没有必要支持key为null的情况,如果看官有什么其他见解,可以留言讨论。


原文地址:https://blog.csdn.net/Ye_GuoLin/article/details/140667896

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!