成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么ConcurrentHashMap不允許插入Null值?

開發 前端
我們在源碼中似乎已經找到了原因,你可以這樣回答面試官,說JDK源碼就是這么規定的。然而,這個原因是不能說服面試官的,雖然,源碼是這樣設計的,我們要思考的是,這樣設計背后更深層次的原因。

在Java語言中,給ConcurrentHashMap和Hashtable這些線程安全的集合中的Key或者Value插入 null(空) 值的會報空指針異常,但是單線程操作的HashMap又允許 Key 或者 Value 插入 null(空) 值。這到底是為什么呢?

1.探尋源碼

為了找到原因,我們先來看這樣一段源碼片段,打開ConcurrentHashMap的putVal()方法,源碼中第一句就非常明確地做了判斷,如果 Key 或者 Value 為 null(空) 值,就直接拋出空指針異常。

我們在源碼中似乎已經找到了原因,你可以這樣回答面試官,說JDK源碼就是這么規定的。然而,這個原因是不能說服面試官的,雖然,源碼是這樣設計的,我們要思考的是,這樣設計背后更深層次的原因。

那到底為什么ConcurrentHashMap不允許插入 null (空)值,HashMap又允許插入呢?

2.歧義問題

因為給ConcurrentHashMap中插入 null (空)值會存在歧義。我們可以假設ConcurrentHashMap允許插入 null(空) 值,那么,我們取值的時候會出現兩種結果:

1)值沒有在集合中,所以返回的結果就是 null (空);

2)值就是 null(空),所以返回的結果就是它原本的 null(空) 值。

這就產生了歧義問題。

那HashMap允許插入 null(空) 值,難道它就不擔心出現歧義嗎?這是因為HashMap的設計是給單線程使用的,所以如果取到 null(空) 值,我們可以通過HashMap的 containsKey(key)方 法來區分這個 null(空) 值到底是插入值是 null(空),還是本就沒有才返回的 null(空) 值。

而 ConcurrentHashMap 就不一樣了,因為 ConcurrentHashMap 是在多線程場景下使用的,它的情況更加復雜。

舉個例子,現在有線程T1調用了 ConcurrentHashMap 的 containsKey(key) 方法,我們期望返回的結果是false,也就是說,T1并沒有往ConcurrentHashMap中 put null(空)值。

但是,恰恰出了個意外,在線程T1還沒有得到返回結果之前,線程T2又調用了ConcurrentHashMap 的 put() 方法,插入了一個Key,并且存入的Value是 null(空) 值。那么,線程T1 最終得到的返回結果就變成 true 了。

顯然,這個結果和我們之前期望的 false 完全不一致。

也就是說,在多線程的復雜情況下,我們多線程的復雜情況下,到底是插入的 null(空) 值,還是本就沒有才返回的 null(空) 值。也就是說,產生的歧義不能被 證 偽,

3.作者回復

對于 ConcurrentHashMap 不允許插入 null 值的問題,有人問過 ConcurrentHashMap 的作者 Doug Lea,以下是他回復的郵件內容:

The main reason that nulls aren't allowed in ConcurrentMaps (ConcurrentHashMaps, ConcurrentSkipListMaps) is that ambiguities that may be just barely tolerable in non-concurrent maps can't be accommodated. The main one is that if map.get(key) returns null, you can't detect whether the key explicitly maps to null vs the key isn't mapped.

In a non-concurrent map, you can check this via map.contains(key),but in a concurrent one, the map might have changed between calls.

Further digressing: I personally think that allowing

nulls in Maps (also Sets) is an open invitation for programs

to contain errors that remain undetected until

they break at just the wrong time. (Whether to allow nulls even

in non-concurrent Maps/Sets is one of the few design issues surrounding

Collections that Josh Bloch and I have long disagreed about.)

It is very difficult to check for null keys and values

in my entire application .

Would it be easier to declare somewhere

static final Object NULL = new Object();

and replace all use of nulls in uses of maps with NULL?

-Doug

以上信件的主要意思是,Doug Lea 認為這樣設計最主要的原因是:不容忍在并發場景下出現歧義!

4.總結

ConcurrentHashMap在源碼中加入不允許插入 null (空) 值的設計,主要目的是為了防止并發場景下的歧義問題。

以上就是我對關于ConcurrentHashMap為什么不允許插入 null (空) 值的解答,聽懂的小伙伴,請關注點個贊,下次不迷路。

責任編輯:武曉燕 來源: Tom彈架構
相關推薦

2022-01-27 07:02:52

JavaHashMap單線程

2023-08-22 20:43:09

HashMap單線程null

2009-06-18 10:47:44

java接口定義變量

2024-09-03 09:45:36

2021-08-23 12:54:12

開發技能代碼

2015-08-17 10:16:00

CentOSDocker命令root

2014-06-30 14:53:49

Android定制google

2020-08-20 11:12:14

iOS 13.6蘋果降級

2011-04-22 10:15:56

Novell專利

2025-03-27 01:10:00

HashMap分段鎖CAS

2010-06-01 16:12:00

2011-03-01 14:12:12

FreebsdProftpd

2010-11-02 15:08:40

設置db2主鍵

2023-05-09 10:05:24

HashMapNull

2010-05-20 13:03:52

IIS父路徑

2024-06-06 08:10:30

多線程Mapnull

2009-09-22 15:54:42

CCIE筆試

2012-01-04 21:24:13

Android 4.0

2023-05-23 08:54:43

SRESLO運營

2010-11-11 16:53:28

SQL Server視
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 最新黄色毛片 | 欧美一区| 免费一区二区三区 | 亚洲精品视频在线播放 | 96国产精品久久久久aⅴ四区 | 四虎影视一区二区 | 99精品九九| 一二三四在线视频观看社区 | 二区不卡 | 欧美日韩在线免费观看 | 国产传媒毛片精品视频第一次 | 久久久久久国产精品 | 欧美视频区 | 国产高清免费 | 天天干狠狠操 | 在线免费黄色小视频 | 中文字幕亚洲视频 | 亚洲精品久久久 | 久久成人精品视频 | 欧美一区二区三区久久精品视 | 午夜欧美日韩 | 黄色网一级片 | 精品少妇一区二区三区在线播放 | 国精产品一品二品国精在线观看 | 欧美日韩高清免费 | 久久精品亚洲精品国产欧美 | 国产精品区一区二区三 | 欧美日一区 | 99国产精品久久久 | 黄色在线免费观看视频网站 | 欧美一级小视频 | 国产成人短视频在线观看 | 欧美黑人一区二区三区 | 看片91| 欧洲av在线 | 日韩三级在线 | 日本一二三区电影 | 亚洲国产成人av好男人在线观看 | 日本三级精品 | 免费精品久久久久久中文字幕 | 日本一区二区高清不卡 |