暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

CourrentHashMap 为啥不能存为空的value

李二狗搞程序 2021-09-19
1112

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



文章转载自李二狗搞程序,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论