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