ConcurrentHashMap中的key與value為什么不能為null


先假定ConcurrentHashMap也可以存放value為null的值。那不管是HashMap還是ConcurrentHashMap調用map.get(key)的時候,如果返回了null,那么這個null,都有兩重含義:

**1.這個key從來沒有在map中映射過。

**2.這個key的value在設置的時候,就是null。

在非線程安全的map集合(HashMap)中可以使用map.contains(key)方法來判斷,而ConcurrentHashMap卻不可以。

hashmap正確使用場景是單線程下,

由於是單線程,當得到的value是null的時候,可以用hashMap.containsKey(key)方法來區分上面說的兩重含義(保證在單線程下 線程安全 不存在並發場景,所以不會存在二義性)。

但是如果是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了。這就與我們的假設的真實情況不符合了。

 

總結:在map容器里面,調用map.get(key)方法得到的值是null,那你無法判斷這個key是在map里面沒有映射過,還是這個key在map里面根本就不存在。這種情況下,在非並發安全的map中,你可以通過map.contains(key)的方法來判斷。但是在考慮並發安全的map中,在兩次調用的過程中,這個值是有可能被改變的。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM