探讨这个问题,我们先要知道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的情况,如果看官有什么其他见解,可以留言讨论。