關(guān)于ConcurrentHashMap的線程安全

在看SimpleAliasRegistry類的代碼發(fā)現(xiàn)握础,在添加別名過程中會對ConcurrentHashMap上鎖

public void registerAlias(String name, String alias) {
        Assert.hasText(name, "'name' must not be empty");
        Assert.hasText(alias, "'alias' must not be empty");
               #對存儲別名的map加鎖
        synchronized (this.aliasMap) {
            if (alias.equals(name)) {
                this.aliasMap.remove(alias);
                if (logger.isDebugEnabled()) {
                    logger.debug("Alias definition '" + alias + "' ignored since it points to same name");
                }
            }
            else {
                String registeredName = this.aliasMap.get(alias);
                if (registeredName != null) {
                    if (registeredName.equals(name)) {
                        // An existing alias - no need to re-register
                        return;
                    }
                    if (!allowAliasOverriding()) {
                        throw new IllegalStateException("Cannot define alias '" + alias + "' for name '" +
                                name + "': It is already registered for name '" + registeredName + "'.");
                    }
                    if (logger.isDebugEnabled()) {
                        logger.debug("Overriding alias '" + alias + "' definition for registered name '" +
                                registeredName + "' with new target name '" + name + "'");
                    }
                }
                checkForAliasCircle(name, alias);
                this.aliasMap.put(alias, name);
                if (logger.isTraceEnabled()) {
                    logger.trace("Alias definition '" + alias + "' registered for name '" + name + "'");
                }
            }
        }
    }

當時不理解既然ConcurrentHashMap是線程安全的為什么還要加鎖垦垂?
加鎖的目的是為了防止alias和name的重復(fù)引用 试幽。參考資料https://cloud.tencent.com/developer/article/1497582

自己產(chǎn)生疑惑的原因是竿秆,對ConcurrentHashMap的理解不夠深入绍绘,只知道是線程安全的解決了HashMap在擴容過程造成的閉環(huán)問題没卸。并沒有深入的理解ConcurrentHashMap提供了那些原子操作戳晌。
put,remove都會對key的Hash值節(jié)點進行上鎖泞辐,保證了這兩個操作的原子性笔横。
get方法沒有上鎖竞滓,通過對node節(jié)點內(nèi)的key,value加上volatile實現(xiàn)避免臟讀吹缔。
所以這些操作在單獨來說是線程安全具有原子性的商佑,但是如果對他們進行組合操作或者多線程操作,就會出現(xiàn)線程不安全的情況厢塘。
舉個先get再put的例子

public static void main(String[] args) throws InterruptedException {
        final ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<String, Integer>();
        map.put("key", 0);
        ExecutorService executorService = Executors.newFixedThreadPool(100);
        for (int i = 0; i < 1000; i++) {
            executorService.execute(new Runnable() {
                public void run() {
                  # synchronized (map){  對map進行上鎖才能保證數(shù)據(jù)準確
                    int key = map.get("key") + 1;
                    map.put("key", key);
                    System.out.println(key);
                #}
                }
            });
        }
        Thread.sleep(3000); //模擬等待執(zhí)行結(jié)束
        System.out.println("------" + map.get("key") + "------");
        executorService.shutdown();
    }

參考資料:
【小家Spring】分享Spring中一個小巧而優(yōu)雅的類SimpleAliasRegistry源碼分析
ConcurrentHashMap 多線程并發(fā)對值+1 總數(shù)不對
ConcurrentHashMap源碼分析(JDK8版本)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茶没,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子晚碾,更是在濱河造成了極大的恐慌抓半,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件格嘁,死亡現(xiàn)場離奇詭異笛求,居然都是意外死亡,警方通過查閱死者的電腦和手機讥蔽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門涣易,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冶伞,你說我怎么就攤上這事新症。” “怎么了响禽?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵徒爹,是天一觀的道長。 經(jīng)常有香客問我芋类,道長隆嗅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任侯繁,我火速辦了婚禮胖喳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贮竟。我一直安慰自己丽焊,他們只是感情好,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布咕别。 她就那樣靜靜地躺著技健,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惰拱。 梳的紋絲不亂的頭發(fā)上雌贱,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音,去河邊找鬼欣孤。 笑死馋没,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的导街。 我是一名探鬼主播披泪,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼纤子,長吁一口氣:“原來是場噩夢啊……” “哼搬瑰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起控硼,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤泽论,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后卡乾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翼悴,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年幔妨,在試婚紗的時候發(fā)現(xiàn)自己被綠了鹦赎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡误堡,死狀恐怖古话,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锁施,我是刑警寧澤陪踩,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站悉抵,受9級特大地震影響肩狂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姥饰,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一傻谁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧列粪,春花似錦审磁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至掺逼,卻和暖如春吃媒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工赘那, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刑桑,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓募舟,卻偏偏與公主長得像祠斧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拱礁,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353