国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

為什么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

2010-11-02 15:08:40

設置db2主鍵

2011-03-01 14:12:12

FreebsdProftpd

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筆試

2010-11-11 16:53:28

SQL Server視

2023-05-23 08:54:43

SRESLO運營

2012-01-04 21:24:13

Android 4.0
點贊
收藏

51CTO技術棧公眾號

日本一区免费网站| 精品高清视频| 成+人+亚洲+综合天堂| 伊人久久大香线蕉av一区二区| 久久视频免费| 免费一级特黄特色毛片久久看| 亚洲精品成人av| 国产suv精品一区二区6| 久久69成人| 中文字幕网av| 国产精品69精品一区二区三区| 亚洲一区二区三区中文字幕在线| 国产精品日韩精品中文字幕| 欧美日韩精品免费观看| 欧美一级高清大全免费观看| 日韩国产成人精品| 精品免费av在线| 天天干天天玩天天操| 国产精品中文字幕在线观看| 欧美图区在线视频| 日韩国产欧美一区二区三区| 久久伊人蜜桃av一区二区| 你懂的视频一区二区| 激情五月激情综合网| www.综合网.com| 亚洲性猛交xxxxwww| 成人中文字幕合集| 中文字幕一区二区三区中文字幕| 成年人羞羞的网站| 日韩免费观看视频| 在线观看免费成人| 久久99国产精品尤物| 成人网av.com/| 欧美承认网站| 久久久久久久久久久一区| 亚洲开心激情网| 中文字幕精品三区| 欧美人与禽猛交乱配视频| 超免费在线视频| 中文字幕在线观看第三页| 国产欧美久久久久久| 日韩久久久精品| 久久久国产午夜精品| 在线色视频观看| 国产一区二区三区黄| 亚洲天堂免费在线| 一区二区高清在线| 日韩一级二级| 成全视频全集| 欧美午夜精品理论片a级大开眼界 欧美午夜精品久久久久免费视 | 91丨九色porny丨蝌蚪| 日本中文字幕在线一区| 麻豆影视在线观看_| 精品一卡二卡三卡| 国产日韩精品久久| 萌白酱国产一区二区| 色8久久人人97超碰香蕉987| 丁香婷婷综合网| 日韩一区三区| 四虎免费av| 精品欧美一区二区久久久伦| 久久久999精品免费| 在线观看国产日韩| 久久久久久久久久久久久夜| 国产日韩精品视频一区二区三区| 蜜桃精品一区二区三区| 成人日批视频| 66av99| 美女视频黄免费的亚洲男人天堂| 一区二区三区欧美亚洲| 国产精品一区二区无线| 在线成人激情| 在线看你懂得| 欧美国产综合在线| 5g国产欧美日韩视频| 久久夜色撩人精品| 欧美视频第二页| 国产精品每日更新在线播放网址| 久热精品在线| 欧美少妇xxxx| av在线精品| av福利在线导航| 日中文字幕在线| 午夜宅男在线视频| 在线观看成人免费| 国产chinese精品一区二区| 久久久久久国产| 亚洲精品视频网上网址在线观看| 日本久久电影网| 亚洲精品国产精华液| 91丨porny丨最新| 久久www免费人成看片高清| 欧美日韩国产免费观看 | 国产一区999| 国产欧美日韩一级| 欧美成人直播| 日本1级在线| 日日噜噜夜夜狠狠| www.男人天堂网| 久久riav二区三区| 国产在线播放不卡| 91国内精品久久| 久久久av一区| 日韩三级在线免费观看| 欧美日韩在线视频观看| 国产精品久久久久久户外露出| 豆国产96在线|亚洲| 精品一区二区三区在线播放| 美女尤物久久精品| 亚洲精品动漫| 麻豆网站视频在线观看| 午夜cr在线观看高清在线视频完整版| 国产精品亚洲激情| 97久久精品视频| 久久精品国产视频| 亚洲欧美日韩在线高清直播| 欧美一区二区三区日韩| 欧美优质美女网站| 色哟哟亚洲精品| 岛国av在线不卡| 亚洲成人免费看| 一片黄亚洲嫩模| 亚洲精品亚洲人成人网在线播放| 欧美韩国日本一区| 国产精品丝袜黑色高跟| 国产视频一区在线播放| 国产夜色精品一区二区av| 久久久久久久久一| 久久麻豆一区二区| 国产三区在线成人av| 久久久亚洲高清| 国产欧美一区二区精品婷婷| 国产日韩欧美不卡| 国产精品国产精品国产专区不蜜 | 日本不卡不卡| 成年人在线视频| 成人77777| 日本高清中文字幕在线| 麻豆网在线观看| 四虎影院观看视频在线观看 | 久久97精品| 加勒比色老久久爱综合网| 国产图片一区| 国产麻豆精品久久| 忘忧草精品久久久久久久高清| 香蕉精品视频在线观看| 久久久久久久久久久9不雅视频| 欧美一区不卡| 久久一区亚洲| 激情综合网av| gogo大胆日本视频一区| 国产亚洲精久久久久久| 一区在线播放视频| 精品久久久久久久中文字幕| 欧美午夜精品免费| 精品国产乱码久久久久久久| 亚洲视频999| 欧美日韩国产成人在线观看| 4388成人网| 欧美一区二区三区在线看| 欧美一二三四区在线| 亚洲精品视频免费在线观看| 久久精品国产一区| 欧美在线一区二区三区四| 国产精品都在这里| 国产成人精品福利一区二区三区| 欧洲亚洲一区二区| 免费一级特黄毛片| 97影院理论片在线播放| 久久天堂电影| 久久男人天堂| 亚洲国产一区二区三区网站| 四季av在线一区二区三区 | xxxx69视频| 日韩有码电影| av中文在线资源库| 亚洲一二av| 欧美一区网站| 国产精品一区二区三区乱码| 欧美极品另类videosde| 色婷婷激情综合| 亚洲欧美日韩一区在线| 91精品国产91久久久久久最新| 91在线观看网站| 欧美一级中文字幕| 性网站在线免费观看| 97香蕉久久| 亚洲精品永久免费视频| 147欧美人体大胆444| 久久精品99久久| 成人在线国产视频| 国内福利写真片视频在线| 不卡av免费观看| 超碰在线成人| 西西裸体人体做爰大胆久久久| 丁香婷婷综合五月| 色呦呦日韩精品| 久久久91精品国产| 国产美女精品在线观看| 日韩激情免费视频|