欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java的ConcurrentHashMap中不能存儲(chǔ)null的原因解析

 更新時(shí)間:2022年07月20日 10:03:27   作者:哪?吒  
眾所周知,在Java中Map可以存儲(chǔ)null,而ConcurrentHashMap不能存儲(chǔ)null值,那么為什么呢?今天通過源碼分析給大家詳細(xì)解讀,感興趣的朋友一起看看吧

眾所周知,在Java中Map可以存儲(chǔ)null,而ConcurrentHashMap不能存儲(chǔ)null值,那么為什么呢?

一、先出源碼出發(fā)

put方法點(diǎn)進(jìn)去~

@throws NullPointerException if the specified key or value is null and this map does not permit null keys or values

可以清晰的看到源碼中規(guī)定,ConcurrentHashMap是不可以存儲(chǔ)null值的。

二、那么究竟這是為什么呢?

可以先具體的了解一下ConcurrentHashMap。

與HashMap一樣,ConcurrentHashMap也是一個(gè)基于散列的Map,但它使用了一種完全不同的加鎖策略來提供更高的并發(fā)性和伸縮性。ConcurrentHashMap并不是將每個(gè)方法都在同一個(gè)鎖上同步并使得每次只能有一個(gè)線程訪問容器,而是使用一種更細(xì)的加鎖機(jī)制來實(shí)現(xiàn)更大程度的共享,這種機(jī)制成為分段鎖。在這種機(jī)制中,任意數(shù)量的讀取線程可以并發(fā)地訪問Map,執(zhí)行讀取操作的線程和執(zhí)行寫入操作的線程可以并發(fā)地訪問Map,并且一定數(shù)量的寫入線程可以并發(fā)地修改Map。ConcurrentHashMap帶來的結(jié)果是,在并發(fā)訪問環(huán)境下將實(shí)現(xiàn)更高的吞吐量,而在單線程環(huán)境中只損失非常小的性能。

ConcurrentHashMap返回的迭代器具有弱一致性,而并非“及時(shí)失敗”。弱一致性的迭代器可以容忍并發(fā)的修改,當(dāng)創(chuàng)建迭代器時(shí)會(huì)遍歷已有的元素,并可以在迭代器被構(gòu)造后將修改操作反映給容器。ConcurrentHashMap返回的迭代器具有弱一致性,而并非“及時(shí)失敗”。弱一致性的迭代器可以容忍并發(fā)的修改,當(dāng)創(chuàng)建迭代器時(shí)會(huì)遍歷已有的元素,并可以在迭代器被構(gòu)造后將修改操作反映給容器。

三、ConcurrentHashMap 作者 Doug Lea 的郵件

對(duì)于 ConcurrentHashMap 不允許插入 null 值的問題,有人問過 ConcurrentHashMap 的作者 Doug Lea,以下是他回復(fù)的郵件內(nèi)容:

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
allowingnulls in Maps (also Sets) is an open invitation for programsto
contain errors that remain undetected untilthey break at just the
wrong time. (Whether to allow nulls evenin non-concurrent Maps/Sets is
one of the few design issues surroundingCollections that Josh Bloch
and I have long disagreed about.)It is very difficult to check for
null keys and valuesin my entire application .Would it be easier to
declare somewherestatic final Object NULL = new Object();and replace
all use of nulls in uses of maps with NULL?

-Doug

以上信件的主要意思是,Doug Lea 認(rèn)為這樣設(shè)計(jì)最主要的原因是:不容忍在并發(fā)場(chǎng)景下出現(xiàn)歧義!

到此這篇關(guān)于Java的ConcurrentHashMap中不能存儲(chǔ)null的原因解析的文章就介紹到這了,更多相關(guān)Java ConcurrentHashMap不能存儲(chǔ)null內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IntelliJ IDEA本地代碼提交到github網(wǎng)站不顯示與本地不同步問題的解決辦法

    IntelliJ IDEA本地代碼提交到github網(wǎng)站不顯示與本地不同步問題的解決辦法

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA本地代碼提交到github網(wǎng)站不顯示與本地不同步問題的解決辦法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • 用SpringBoot+Vue+uniapp小程序?qū)崿F(xiàn)在線房屋裝修管理系統(tǒng)

    用SpringBoot+Vue+uniapp小程序?qū)崿F(xiàn)在線房屋裝修管理系統(tǒng)

    這篇文章主要介紹了用SpringBoot+Vue+uniapp實(shí)現(xiàn)在線房屋裝修管理系統(tǒng),針對(duì)裝修樣板信息管理混亂,出錯(cuò)率高,信息安全性差,勞動(dòng)強(qiáng)度大,費(fèi)時(shí)費(fèi)力等問題開發(fā)了這套系統(tǒng),需要的朋友可以參考下
    2023-03-03
  • Java實(shí)現(xiàn)分布式系統(tǒng)限流

    Java實(shí)現(xiàn)分布式系統(tǒng)限流

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)分布式系統(tǒng)限流,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • java異或加密算法

    java異或加密算法

    這篇文章主要介紹了java異或加密算法,有需要的朋友可以參考一下
    2013-12-12
  • Java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之棧和隊(duì)列

    Java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之棧和隊(duì)列

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之棧和隊(duì)列,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-05-05
  • 求1000階乘的結(jié)果末尾有多少個(gè)0

    求1000階乘的結(jié)果末尾有多少個(gè)0

    題目是:求1000!的結(jié)果末尾有多少個(gè)0,解題思路:兩個(gè)素?cái)?shù)2、5,相乘即可得到10,我們可以認(rèn)為,有多少組2、5,結(jié)尾就有多少個(gè)0,下面是代碼,需要的朋友可以參考下
    2014-02-02
  • btrace定位生產(chǎn)故障的方法示例

    btrace定位生產(chǎn)故障的方法示例

    這篇文章主要介紹了btrace定位生產(chǎn)故障的方法示例,文中通過示例代碼介紹的很詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。
    2017-02-02
  • IDEA 熱部署設(shè)置(JRebel插件激活)

    IDEA 熱部署設(shè)置(JRebel插件激活)

    這篇文章主要介紹了IDEA 熱部署設(shè)置(JRebel插件激活),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Elasticsearch?mapping?概念及自動(dòng)創(chuàng)建示例

    Elasticsearch?mapping?概念及自動(dòng)創(chuàng)建示例

    這篇文章主要為大家介紹了Elasticsearch?mapping?概念及自動(dòng)創(chuàng)建示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • mall整合SpringSecurity及JWT實(shí)現(xiàn)認(rèn)證授權(quán)實(shí)戰(zhàn)

    mall整合SpringSecurity及JWT實(shí)現(xiàn)認(rèn)證授權(quán)實(shí)戰(zhàn)

    這篇文章主要為大家介紹了mall整合SpringSecurity及JWT實(shí)現(xiàn)認(rèn)證授權(quán)實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06

最新評(píng)論