JDK 1.8 ConcurrentHashMap (一) —— initTable

JDK 1.8 的JUC對CurrentHashMap 重新定義后做了很大的變革。我們一點(diǎn)一點(diǎn)來拆解患整,今天就先說說他的 InitTable 方法

上代碼:

ConcurrentHashMap的initTable 初始化方法

關(guān)于何時(shí)初始化我們后面說Put的時(shí)候在討論眯停,今天就先說說這個(gè)InitTable

并發(fā)包是如何做到既保證并發(fā)安全又保證高性能的呢济舆?

關(guān)鍵知識(shí)點(diǎn):

1、CAS

2莺债、volatile


代碼中的高亮部分標(biāo)記了sizeCtl滋觉。

sizeCtl是何物?

看圖:

參數(shù)sizeCtl


Unsafe的初始化


sizeCtl 默認(rèn)為0齐邦,用來控制table的初始化和擴(kuò)容操作

? ? ? ? 如果sizeCtl 為-1 則說明正在初始化

? ??????????????-N?表示有N-1個(gè)線程正在進(jìn)行擴(kuò)容操作


注意:圖二中SIZECTL中獲取的 sizeCtl的地址偏移值椎侠,是在static中初始化的。


get到了關(guān)鍵信息措拇,我們先放一邊我纪,繼續(xù)說init方法


if ((sc =sizeCtl) <0)? ??

????????Thread.yield(); // lost initialization race; just spin

else if (U.compareAndSwapInt(this, SIZECTL, sc, -1))

..... //后續(xù)省略



第一步:

????????????????是判斷SizeCtl是不是<0? 判斷是否正在初始化。如果是那就Thread.yield() 實(shí)則就只允許一個(gè)線程操作丐吓,是個(gè)自選的操作

第二步:

????????????????U.compareAndSwapInt(this, SIZECTL, sc, -1)? 這個(gè)cas的判斷地址并操作為-1

????????????????unsafe方法中的Cas 判斷了地址偏移浅悉,(SIZECTL早在static就以初始化好了)

????????????????如果比較為True 那就更新為-1。原子操作保證了安全券犁。(不明白CAS的移步百度查詢Unsafe的Cas)

????????????????同時(shí)volatile保證了順序與內(nèi)存可見性术健。




總結(jié):在第一步進(jìn)行判斷,是不能保證并發(fā)安全的粘衬,如果兩個(gè)線程同時(shí)進(jìn)入荞估,就需要Cas去保證安全比被,并且原子變更數(shù)值

當(dāng)然sizeCtl 不僅僅在init中使用,還在擴(kuò)容中使用泼舱〉茸海縱觀整個(gè)類會(huì)發(fā)現(xiàn)大量的Unsafe的方法。雖然官方并不推薦使用娇昙,

但是事實(shí)證明 Doug Lea 是你大爺尺迂,還是你大爺。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冒掌,一起剝皮案震驚了整個(gè)濱河市噪裕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌股毫,老刑警劉巖膳音,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異铃诬,居然都是意外死亡祭陷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門趣席,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兵志,“玉大人,你說我怎么就攤上這事宣肚∠牒保” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵霉涨,是天一觀的道長按价。 經(jīng)常有香客問我,道長笙瑟,這世上最難降的妖魔是什么楼镐? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮逮走,結(jié)果婚禮上鸠蚪,老公的妹妹穿的比我還像新娘。我一直安慰自己师溅,他們只是感情好茅信,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著墓臭,像睡著了一般蘸鲸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窿锉,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天酌摇,我揣著相機(jī)與錄音膝舅,去河邊找鬼。 笑死窑多,一個(gè)胖子當(dāng)著我的面吹牛仍稀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播埂息,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼技潘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了千康?” 一聲冷哼從身側(cè)響起享幽,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拾弃,沒想到半個(gè)月后值桩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡豪椿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年奔坟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砂碉。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛀蜜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出增蹭,到底是詐尸還是另有隱情,我是刑警寧澤磅摹,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布滋迈,位于F島的核電站,受9級特大地震影響户誓,放射性物質(zhì)發(fā)生泄漏饼灿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一帝美、第九天 我趴在偏房一處隱蔽的房頂上張望碍彭。 院中可真熱鬧,春花似錦悼潭、人聲如沸庇忌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽皆疹。三九已至,卻和暖如春占拍,著一層夾襖步出監(jiān)牢的瞬間略就,已是汗流浹背捎迫。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留表牢,地道東北人窄绒。 一個(gè)月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像崔兴,于是被迫代替她去往敵國和親颗祝。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351