為什么要用ConcurrentHashMap? ConcurrentHashMap是JUC包下的一個(gè)線程安全的HashMap類(lèi),我們都知道多線程的場(chǎng)景下要用ConcurrentHashMap來(lái)代替HashMap使用,有沒(méi)有想過(guò)為什么不能用HashMap,為什么能用ConcurrentHashMap呢
ConcurrentHashMap是JUC(Java Util Concurrent)包下的一個(gè)線程安全的HashMap類(lèi)。在多線程場(chǎng)景下,我們通常選擇使用ConcurrentHashMap來(lái)替代HashMap。但為什么不能直接使用HashMap呢?為什么ConcurrentHashMap可以勝任多線程環(huán)境呢?接下來(lái),我將通過(guò)源碼分析的方式,帶領(lǐng)大家深入探討其中的一些細(xì)節(jié)。
HashMap是基于數(shù)組的一種數(shù)據(jù)結(jié)構(gòu),在JDK 1.8中,HashMap以數(shù)組+鏈表/紅黑樹(shù)的形式存在。然而,在多線程任務(wù)中對(duì)HashMap進(jìn)行操作可能會(huì)導(dǎo)致并發(fā)異常。這一點(diǎn)可以從下圖中的nextNode方法源碼中得到明顯的解釋。當(dāng)多個(gè)線程同時(shí)進(jìn)行put操作時(shí),可能存在并發(fā)異常的風(fēng)險(xiǎn)。
接著我們看到,nextNode方法中的if條件判斷中的兩個(gè)變量是做什么用的呢?為什么這兩個(gè)變量不相同時(shí)就會(huì)拋出異常呢?
小編推薦閱讀使用VSCode搭建UniApp + TS + Vue3 + Vite項(xiàng)目
閱讀在MDK開(kāi)發(fā)環(huán)境下自定義安裝與切換不同編譯器版本的方法
閱讀一步一步將PlantUML類(lèi)圖導(dǎo)出為自定義格式的XMI文件
閱讀musl libc 與 glibc 在 .NET 應(yīng)用程序中的兼容性
閱讀受 LabelImg 啟發(fā)的基于 web 的圖像標(biāo)注工具,基于 Vue 框架
閱讀光影精靈10 Win1+Ubuntu18.04 雙系統(tǒng) 踩坑記錄
閱讀線上集群中,如何處理出現(xiàn)大量錯(cuò)誤日志的Pod
閱讀LoRA模型:小型Stable Diffusion模型的微調(diào)技術(shù)
閱讀肉夾饃(Rougamo)編譯時(shí)AOP組件介紹及IoC/DI擴(kuò)展
閱讀C#用戶(hù)控件之轉(zhuǎn)換開(kāi)關(guān)
閱讀在CentOS 7上部署WebAPI項(xiàng)目的詳細(xì)步驟
閱讀LOTO示波器統(tǒng)計(jì)曲線和故障分析pass/fail測(cè)試
閱讀Archery:開(kāi)源數(shù)據(jù)庫(kù)管理平臺(tái)
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]
湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2024 haote.com 好特網(wǎng)