Java鎖事之重量級鎖

Java中的重量級鎖是通過ObjectMonitor實現(xiàn)的谷市。接下來簡單分析下ObjectMonitor的實現(xiàn)邏輯。

Objectmonitor中的關(guān)鍵詞

  • EntryList
  • WaitList
  • cxq(ContentionList)
  • Owner
  • OnDeckThread
  • recursions

cxq(競爭列表)

cxq是一個單向鏈表辐赞。被掛起線程等待重新競爭鎖的鏈表, monitor 通過CAS將包裝成ObjectWaiter寫入到列表的頭部。為了避免插入和取出元素的競爭漾橙,所以O(shè)wner會從列表尾部取元素婶恼。

重量級鎖3.jpg

EntryList(鎖候選者列表)

EntryList是一個雙向鏈表。當(dāng)EntryList為空畅涂,cxq不為空港华,Owener會在unlock時,將cxq中的數(shù)據(jù)移動到EntryList午衰。并指定EntryList列表頭的第一個線程為OnDeck線程立宜。

EntryList跟cxq的區(qū)別

在cxq中的隊列可以繼續(xù)自旋等待鎖冒萄,若達到自旋的閾值仍未獲取到鎖則會調(diào)用park方法掛起。而EntryList中的線程都是被掛起的線程赘理。

WaitList

WatiList是Owner線程地調(diào)用wait()方法后進入的線程宦言。進入WaitList中的線程在notify()/notifyAll()調(diào)用后會被加入到EntryList。

Owner

當(dāng)前鎖持有者商模。

OnDeckThread

可進行鎖競爭的線程奠旺。若一個線程被設(shè)置為OnDeck,則表明其可以進行tryLock操作施流,若獲取鎖成功响疚,則變?yōu)镺wner,否則仍將其回插到EntryList頭部。

OnDeckThread競爭鎖失敗的原因

cxq中的線程可以進行自旋競爭鎖瞪醋,所以O(shè)nDeckThread若碰上自旋線程就需要和他們競爭

recursions(重入計數(shù)器)

用來表示某個線程進入該鎖的次數(shù)忿晕。

重量級鎖2.jpg

執(zhí)行流程

獲取monitor

  1. 線程首先通過CAS嘗試將monitor的owner設(shè)置為自己。
  2. 若執(zhí)行成功银受,則判斷該線程是不是重入践盼。若是重入,則執(zhí)行recursions + 1,否則執(zhí)行recursions = 1宾巍。
  3. 若失敗咕幻,則將自己封裝為ObjectWaiter,并通過CAS加入到cxq中顶霞。

釋放monitor

  1. 判斷是否為重量級鎖肄程,是則繼續(xù)流程。
  2. recursions - 1
  3. 根據(jù)不同的策略設(shè)置一個OnDeckThread

參考

  1. The underlying JVM is how to realize the synchronized

  2. 對象頭

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末选浑,一起剝皮案震驚了整個濱河市蓝厌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌古徒,老刑警劉巖拓提,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異隧膘,居然都是意外死亡崎苗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門舀寓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胆数,“玉大人,你說我怎么就攤上這事互墓”啬幔” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長判莉。 經(jīng)常有香客問我豆挽,道長,這世上最難降的妖魔是什么券盅? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任帮哈,我火速辦了婚禮,結(jié)果婚禮上锰镀,老公的妹妹穿的比我還像新娘娘侍。我一直安慰自己,他們只是感情好泳炉,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布憾筏。 她就那樣靜靜地躺著,像睡著了一般花鹅。 火紅的嫁衣襯著肌膚如雪氧腰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天刨肃,我揣著相機與錄音古拴,去河邊找鬼。 笑死真友,一個胖子當(dāng)著我的面吹牛黄痪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锻狗,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼焕参!你這毒婦竟也來了轻纪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤叠纷,失蹤者是張志新(化名)和其女友劉穎刻帚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涩嚣,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡崇众,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了航厚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顷歌。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖幔睬,靈堂內(nèi)的尸體忽然破棺而出眯漩,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布赦抖,位于F島的核電站舱卡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏队萤。R本人自食惡果不足惜轮锥,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望要尔。 院中可真熱鬧舍杜,春花似錦、人聲如沸盈电。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匆帚。三九已至熬词,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吸重,已是汗流浹背互拾。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嚎幸,地道東北人颜矿。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像嫉晶,于是被迫代替她去往敵國和親骑疆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353