基于JDK1.8的ConcurrentHashMap的源碼分析:
ConcurrentHashMap是線程安全的瓶埋,利用的是 Node+CAS算法+Synchronized關(guān)鍵字 來保證并發(fā)更新的安全
數(shù)據(jù)機(jī)構(gòu)是:數(shù)組+鏈表+紅黑樹
重要的成員變量:
1、 table:默認(rèn)為null,初始化發(fā)生在第一次插入操作嘀掸,默認(rèn)大小為16的數(shù)組,用來存儲(chǔ)Node節(jié)點(diǎn)數(shù)據(jù),擴(kuò)容時(shí)大小總是2的冪次方。
2鹤树、 nextTable:默認(rèn)為null,擴(kuò)容時(shí)新生成的數(shù)組逊朽,其大小為原數(shù)組的兩倍罕伯。
3、 sizeCtl :默認(rèn)為0叽讳,用來控制table的初始化和擴(kuò)容操作追他,具體應(yīng)用在后續(xù)會(huì)體現(xiàn)出來。
1) -1 代表table正在初始化
2) -N 表示有N-1個(gè)線程正在進(jìn)行擴(kuò)容操作
3) 其余情況:
① 如果table未初始化岛蚤,表示table需要初始化的大小邑狸。
② 如果table初始化完成,表示table的容量涤妒,默認(rèn)是table大小的0.75倍单雾,居然用這個(gè)公式算0.75(n - (n >>> 2))。
4、 Node:保存key铁坎,value及key的hash值的數(shù)據(jù)結(jié)構(gòu)蜂奸。其中value和next都用volatile修飾,保證并發(fā)的可見性硬萍。
5、ForwardingNode:一個(gè)特殊的Node節(jié)點(diǎn)围详,hash值為-1朴乖,其中存儲(chǔ)nextTable的引用。只有table發(fā)生擴(kuò)容的時(shí)候助赞,F(xiàn)orwardingNode才會(huì)發(fā)揮作用买羞,作為一個(gè)占位符放在table中表示當(dāng)前節(jié)點(diǎn)為null或則已經(jīng)被移動(dòng)。
基本屬性:
注:Unsafe實(shí)例雹食,主要用于反射獲取對(duì)象相應(yīng)的字段畜普。
ConcurrentHashMap JDK1.7和JDK1.8的區(qū)別
構(gòu)造函數(shù)有那些:
1.//無參構(gòu)造函數(shù)
ConcurrentHashMap(){}
2. //可傳初始容器大小的構(gòu)造函數(shù)
ConcurrentHashMap(int initialCapacity){}
3. //可傳入map的構(gòu)造函數(shù)
ConcurrentHashMap(Map<? extends K, ? extends V> m) {}
4. //可設(shè)置閾值和初始容量
ConcurrentHashMap(int initialCapacity, float loadFactor) {}
5. //可設(shè)置初始容量和閾值和并發(fā)級(jí)別
ConcurrentHashMap(int initialCapacity, float loadFactor, int concurrencyLevel) {}