2020-08-08:ConcurrentHashMap學(xué)習(xí)

Java8中ConcurrentHashMap的結(jié)構(gòu)

桶里的結(jié)構(gòu) : Node<K,V>

ForwardingNode : 頭節(jié)點(diǎn),類似哨兵的功能吧??

ConcurrentHashMap中的原子操作

全部用的時(shí)Unsafe的方法,這個Unsafe方法要了解下

ConcurrentHashMap的功能實(shí)現(xiàn)

1.ConcurrentHashMap初始化

重要的參數(shù)sizeCtl :初始化和擴(kuò)容都有用到 ;PS:含義豐富,

CHM的初始化,只是初始化參數(shù); table的初始化是在put第一個元素時(shí)進(jìn)行


2.ConcurrentHashMap的put方法

onlyIfAbsent 用來控制Node節(jié)點(diǎn)key,hashCode相同時(shí),是否進(jìn)行value替換。 true:不替換; false:替換。

實(shí)驗(yàn):?

ConcurrentHashMap cmap =new ConcurrentHashMap();

cmap.put("1","1");

cmap.put("1","2");

cmap.put("1","3");

然后調(diào)用get("1");? 結(jié)果是:3;

結(jié)論: 默認(rèn)情況下,onlyIfAbsent? 為true; 多次put同一個key,會產(chǎn)生多個Node;但是只能訪問最后一個put的Node;

當(dāng)桶內(nèi)節(jié)點(diǎn)達(dá)到8個,會由鏈表轉(zhuǎn)為紅黑樹

ConcurrentHashMap的擴(kuò)容機(jī)制


ConcurrentHashMap的get方法

當(dāng)存在key不同但hashcode相同的節(jié)點(diǎn)時(shí),調(diào)用get方法會遍歷所以在桶下的所有Node;





參考鏈接:?https://blog.csdn.net/programerxiaoer/article/details/80040090

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容