知乎查询到的答案
ConcurrentHashmap和Hashtable都是支持并发的,这样会有一个问题,当你通过get(k)获取对应的value时,如果获取到的是null时,你无法判断,它是put(k,v)的时候value为null,还是这个key从来没有做过映射。HashMap是非并发的,可以通过contains(key)来做这个判断。而支持并发的Map在调用m.contains(key)和m.get(key),m可能已经不同了。
翻译一下最后一句话,其实contains(key)也是可以使用synchronized进行同步的,所以调用contains(key)得到的就是该线程本时刻map的状态,本身不存在歧义。问题的关键在于多线程情况下,即便此可你通过contains(key)知晓了是否包含null,下一步当你使用这个结果去做一些事情时可能其他线程已经改变了这种状态,这在单线程下是不可能发生的。
评论区