synchronized詳解

synchronized詳解

解釋

synchronized是jvm級別的一種重量級鎖们何,但是隨著jdk對synchronized的不斷優(yōu)化,現(xiàn)在它已經(jīng)變得沒有我們想象的那么重了。由于synchronized使用簡單根资,也不用手動釋放鎖,因此我們平時開發(fā)中用到最多的鎖就是它了。

synchronized鎖的三種形式

  • 普通方法:鎖是當前對象實例
  • 靜態(tài)方法:鎖是當前類的Class對象
  • 同步方法塊:鎖是synchronized括號里的對象

實現(xiàn)原理

同步代碼塊在編譯后會在前后分別插入monitorenter和monitorexit指令热幔,每個對象在同一時刻只會與一個monitor相關(guān)聯(lián),當線程執(zhí)行到monitorenter指令時就會嘗試獲取對象所對應(yīng)的monitor的所有權(quán)讼庇,如果這個monitor已經(jīng)被其他線程獲取绎巨,則需要等待鎖釋放。

對象頭

synchronized鎖是存在對象頭中的蠕啄。如果對象是數(shù)組類型场勤,則虛擬機用3個字寬存儲對象頭,如果對象是非數(shù)組類型歼跟,則用2個字寬存儲對象頭和媳。在32位虛擬機中,1字寬等于4字節(jié)哈街,即32bit留瞳。

補充一點:Java對象保存在內(nèi)存中,由三部分組成:對象頭骚秦、實例數(shù)據(jù)她倘、對齊填充字節(jié)。Java頭由三部分組成:Mark Word作箍、指向類的指針帝牡、數(shù)組長度(只有數(shù)組對象才有)。

32位jvm的Mark Word的存儲結(jié)構(gòu)如下

鎖狀態(tài) 25bit 4bit 1bit是否偏向鎖 2bit鎖標志位
無鎖狀態(tài) 對象的hashCode 對象分代年齡 0 01

Mark Word中的數(shù)據(jù)隨著鎖標志位的變化而變化蒙揣,如下

mark

鎖的升級

java1.6以后靶溜,為了減少獲取鎖和釋放鎖的性能消耗,引入了“偏向鎖”和”輕量級鎖“懒震。鎖的狀態(tài)可以從無鎖狀態(tài)->偏向鎖->輕量級鎖->重量級鎖罩息,隨著競爭情況逐漸升級,但是不能降級个扰。

mark

偏向鎖

大多數(shù)情況下瓷炮,鎖不僅不存在多線程競爭,而且總是由同一個線程多次獲得递宅,為了讓線程獲得鎖的代價更低引入了偏向鎖娘香。當一個線程訪問同步塊并獲取鎖時苍狰,會在對象頭和棧幀中的鎖記錄里存儲鎖偏向的線程ID,以后該線程在進入和退出同步塊時不需要進行CAS操作來加鎖和解釋烘绽,只需要簡單地測試一下對象頭的Mark Word里是否存儲著指向當前線程的偏向鎖淋昭。如果是,則直接獲得鎖安接,執(zhí)行同步塊翔忽;如果不是,則使用CAS操作更改線程ID盏檐,更改成功獲得鎖歇式,更改失敗開始撤銷偏向鎖。

撤銷偏向鎖

偏向鎖只有存在鎖競爭的情況下才會釋放胡野。撤銷偏向鎖需要等待全局安全點(在這個時間點上沒有正在執(zhí)行的字節(jié)碼)材失,首先暫停偏向鎖持有的線程,然后檢查此線程是否活著硫豆,如果線程不處于活動狀態(tài)豺憔,則轉(zhuǎn)成無鎖狀態(tài);如果還活著够庙,升級為輕量級鎖恭应。下圖展示了偏向鎖的獲得與撤銷過程

mark

輕量級鎖

  • 加鎖:線程在執(zhí)行同步塊之前,jvm會先在線程的棧幀中創(chuàng)建用于存儲鎖記錄的空間耘眨,然后將對象的Mark Word復(fù)制到鎖記錄中昼榛,官方稱Displaced Mark Word,再重試使用CAS將對象頭中的Mark Word替換為指向鎖記錄的指針剔难。如果成功胆屿,則獲取鎖;如果失敗偶宫,表示其他線程競爭鎖非迹,當前線程使用自旋來獲取鎖。
  • 解鎖:輕量級鎖解鎖時纯趋,會使用CAS操作將Displaced Mark Word替換回對象頭中憎兽,如果成功,表示沒有競爭發(fā)生吵冒;如果失敗纯命,表示當前鎖存在競爭,鎖就會膨脹成重量級鎖痹栖。下圖展示鎖膨脹流程圖亿汞。
mark

重量級鎖

因為自旋會消耗CPU,為了避免無用的自旋揪阿,一旦鎖升級成重量級鎖疗我,就不會再恢復(fù)到輕量級鎖狀態(tài)咆畏。當鎖處于這個狀態(tài)下,其他線程試圖獲取鎖時吴裤,都會被阻塞住旧找,當持有鎖的線程釋放鎖之后會喚醒這些線程,被喚醒的線程就會進行新一輪的奪鎖之爭嚼摩。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市矿瘦,隨后出現(xiàn)的幾起案子枕面,更是在濱河造成了極大的恐慌,老刑警劉巖缚去,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潮秘,死亡現(xiàn)場離奇詭異,居然都是意外死亡易结,警方通過查閱死者的電腦和手機枕荞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搞动,“玉大人躏精,你說我怎么就攤上這事○兄祝” “怎么了矗烛?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長箩溃。 經(jīng)常有香客問我瞭吃,道長,這世上最難降的妖魔是什么涣旨? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任歪架,我火速辦了婚禮,結(jié)果婚禮上霹陡,老公的妹妹穿的比我還像新娘和蚪。我一直安慰自己,他們只是感情好烹棉,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布惠呼。 她就那樣靜靜地躺著,像睡著了一般峦耘。 火紅的嫁衣襯著肌膚如雪剔蹋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天辅髓,我揣著相機與錄音泣崩,去河邊找鬼少梁。 笑死,一個胖子當著我的面吹牛矫付,可吹牛的內(nèi)容都是我干的凯沪。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼买优,長吁一口氣:“原來是場噩夢啊……” “哼妨马!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起杀赢,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤烘跺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后脂崔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滤淳,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年砌左,在試婚紗的時候發(fā)現(xiàn)自己被綠了脖咐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡汇歹,死狀恐怖屁擅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情产弹,我是刑警寧澤煤蹭,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站取视,受9級特大地震影響硝皂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜作谭,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一稽物、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧折欠,春花似錦贝或、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至酱床,卻和暖如春羊赵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工昧捷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留闲昭,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓靡挥,卻偏偏與公主長得像序矩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子跋破,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容