JDK6 synchronized加鎖過(guò)程

JDK版本: 1.6

前言

jdk1.6對(duì)synchronized鎖進(jìn)行了一些列的優(yōu)化, 由原來(lái)的直接使用重量級(jí)鎖,改為鎖強(qiáng)度逐漸升級(jí)的方式,主要分為三種強(qiáng)度的鎖,無(wú)鎖>偏向鎖>輕量級(jí)鎖>重量級(jí)鎖,且只能升級(jí)不能降級(jí). 期間使用了CAS和自旋,自適應(yīng)自旋,鎖粗化,鎖消除等技術(shù)

基本概念

自旋鎖

根據(jù)經(jīng)驗(yàn), 線(xiàn)程自旋等待一會(huì), 不放棄CPU執(zhí)行時(shí)間, 通惩保可以取得很好的效果, 一般都能拿到鎖

自適應(yīng)自旋

根據(jù)上次自旋的效果, 如果上次獲取鎖成功, 那么本次自旋的次數(shù)會(huì)增加, 如果之前是失敗的, 那么自旋次數(shù)會(huì)一直減少直到減少到0,避免浪費(fèi)處理器資源

鎖消除

StringBuffer的append方法如果在一個(gè)方法塊中運(yùn)行, 虛擬機(jī)檢測(cè)到方法不會(huì)逃逸出去, 那么就會(huì)進(jìn)行鎖消除

鎖粗化

單線(xiàn)程一個(gè)代碼塊中如果頻繁的加鎖和釋放鎖, 對(duì)性能會(huì)有影響, 于是通過(guò)鎖粗化, 在開(kāi)始和結(jié)束的時(shí)候進(jìn)行加鎖和釋放即可

無(wú)鎖

鎖資源未被任何線(xiàn)程持有

偏向鎖

大多數(shù)情況下, 鎖不存在多線(xiàn)程競(jìng)爭(zhēng)的情況, 都是單個(gè)線(xiàn)程持有,為了避免頻繁使用CAS更新對(duì)象頭部的MarkWord,于是引入了偏向鎖, 線(xiàn)程只需要判斷對(duì)象頭部的線(xiàn)程Id是否為當(dāng)前線(xiàn)程,如果是,即可獲取到鎖資源

輕量級(jí)鎖

輕量級(jí)鎖的引入,處于一種假設(shè),假設(shè)多線(xiàn)程競(jìng)爭(zhēng)鎖資源的情況下,線(xiàn)程可以通過(guò)自旋一段時(shí)間,即可獲取到鎖資源.

這樣的好處是申請(qǐng)鎖的線(xiàn)程不必放棄CPU使用時(shí)間,降低線(xiàn)程上下文切換所造成的開(kāi)銷(xiāo)

重量級(jí)鎖

直接阻塞等待鎖資源的線(xiàn)程,通過(guò)操作系統(tǒng)mutex機(jī)制,鎖定資源,涉及到內(nèi)核線(xiàn)程和用戶(hù)線(xiàn)程的切換,開(kāi)銷(xiāo)相對(duì)較大

鎖升級(jí)過(guò)程

無(wú)鎖>偏向鎖

圖片來(lái)自書(shū)籍: java并發(fā)編程的藝術(shù)

需要注意的是,偏向鎖的撤銷(xiāo),是被動(dòng)的,只有其他線(xiàn)程嘗試獲取偏向鎖,才會(huì)去撤銷(xiāo)當(dāng)前線(xiàn)程所持有的偏向鎖,然后根據(jù)當(dāng)前線(xiàn)程的方法執(zhí)行情況,設(shè)置對(duì)象頭中的鎖狀態(tài)為無(wú)鎖狀態(tài)或者升級(jí)為偏向鎖

偏向鎖>輕量級(jí)鎖

  1. 線(xiàn)程2來(lái)競(jìng)爭(zhēng)鎖對(duì)象;
  2. 判斷當(dāng)前對(duì)象頭是否是偏向鎖;
  3. 判斷擁有偏向鎖的線(xiàn)程1是否還存在;
  4. 線(xiàn)程1不存在,直接設(shè)置偏向鎖標(biāo)識(shí)為0(線(xiàn)程1執(zhí)行完畢后,不會(huì)主動(dòng)去釋放偏向鎖);
  5. 使用cas替換偏向鎖線(xiàn)程ID為線(xiàn)程2,鎖不升級(jí)贡未,仍為偏向鎖;
  6. 線(xiàn)程1仍然存在,暫停線(xiàn)程1怕犁;
  7. 設(shè)置鎖標(biāo)志位為00(變?yōu)檩p量級(jí)鎖),偏向鎖為0;
  8. 從線(xiàn)程1的空閑monitor record中讀取一條,放至線(xiàn)程1的當(dāng)前monitor record中;
  9. 更新mark word,將mark word指向線(xiàn)程1中monitor record的指針;
  10. 繼續(xù)執(zhí)行線(xiàn)程1的代碼;
  11. 鎖升級(jí)為輕量級(jí)鎖;
  12. 線(xiàn)程2自旋來(lái)獲取鎖對(duì)象;

原文鏈接: http://www.voidcn.com/article/p-hagongck-wk.html

輕量級(jí)鎖>重量級(jí)鎖

圖片來(lái)自書(shū)籍: java并發(fā)編程的藝術(shù)

鎖升級(jí)全過(guò)程

首先看下內(nèi)存中和synchronized鎖相關(guān)的數(shù)據(jù)結(jié)構(gòu),主要包括:線(xiàn)程,方法棧,對(duì)象頭部,MonitorObject四個(gè)對(duì)象

內(nèi)存數(shù)據(jù)結(jié)構(gòu)

?

  • 對(duì)象頭信息被稱(chēng)為mark word,保存了鎖相關(guān)的信息
  • MonitorObject用于實(shí)現(xiàn)重量級(jí)鎖, 底層通過(guò)操作系統(tǒng)的mutex來(lái)阻塞獲取鎖資源的線(xiàn)程

主要過(guò)程

1.初始狀態(tài)為無(wú)鎖狀態(tài)

2.線(xiàn)程1判斷java對(duì)象頭部中的線(xiàn)程Id是否為當(dāng)前線(xiàn)程

如果是: 則獲取鎖成功, 執(zhí)行步驟13

如果不是: 則CAS修改**對(duì)象頭部**的中的線(xiàn)程Id為**線(xiàn)程1**的線(xiàn)程Id,獲取偏向鎖成功

3.線(xiàn)程1繼續(xù)執(zhí)行

4.線(xiàn)程2嘗試獲取鎖,發(fā)現(xiàn)對(duì)象頭部中的線(xiàn)程Id不是線(xiàn)程2的線(xiàn)程Id,于是CAS嘗試修改對(duì)象頭部線(xiàn)程Id,由于此時(shí)頭部中的線(xiàn)程Id不為null, 修改失敗

5.執(zhí)行撤銷(xiāo)線(xiàn)程1偏向鎖操作

6.stop the world

7.檢查線(xiàn)程1棧幀列表中是否存在該鎖信息,用于判斷被加鎖的方法是否正在運(yùn)行

如果沒(méi)有運(yùn)行,則鎖狀態(tài)被設(shè)置為**無(wú)鎖轉(zhuǎn)態(tài)**,**線(xiàn)程2**使用CAS獲取偏向鎖成功,執(zhí)行步驟13

如果正在運(yùn)行,即鎖定的代碼塊正在**方法棧列表**中執(zhí)行, 那么鎖升級(jí)為輕量級(jí)鎖,此時(shí)方法棧中會(huì)生成LockRecord信息,并使用CAS替換對(duì)象頭的MarkWord信息

8.線(xiàn)程1被喚醒繼續(xù)運(yùn)行

9.線(xiàn)程2通過(guò)CAS自旋嘗試獲取輕量鎖

**線(xiàn)程1**執(zhí)行完畢,釋放輕量級(jí)鎖, 于是**線(xiàn)程2**獲取輕量級(jí)鎖成功,執(zhí)行步驟13

**線(xiàn)程1**還在執(zhí)行,則**線(xiàn)程2**獲取鎖失敗,鎖膨脹,升級(jí)為**重量級(jí)鎖**,**線(xiàn)程2**阻塞

10.線(xiàn)程1繼續(xù)執(zhí)行

11.線(xiàn)程1執(zhí)行完畢后,釋放鎖,并喚醒阻塞中的線(xiàn)程,此時(shí)線(xiàn)程2被喚醒

12.此時(shí)如果只剩下線(xiàn)程2嘗試去獲取鎖資源,那么線(xiàn)程2獲取重量級(jí)鎖成功,執(zhí)行步驟13

13.成功返回

鎖的優(yōu)缺點(diǎn)比較

圖片來(lái)自書(shū)籍: java并發(fā)編程的藝術(shù)

結(jié)語(yǔ)

對(duì)于鎖升級(jí)全過(guò)程這部分的內(nèi)容, 大家有任何想法,歡迎評(píng)論區(qū)留言~

參考資料

書(shū)籍:java并發(fā)編程的藝術(shù)

ObjectMonitor數(shù)據(jù)結(jié)構(gòu): http://www.sohu.com/a/328600103_120210224>

ObjectMonitor英文資料: https://www.artima.com/insidejvm/ed2/threadsynchP.html

Object類(lèi)中的wait和notify方法: https://blog.csdn.net/qq_38293564/article/details/80432875

https://blog.csdn.net/qq_38293564/article/details/80409861

https://blog.csdn.net/u012465296/article/details/53022317

https://www.cnblogs.com/javaminer/p/3889023.html

https://blog.csdn.net/tongdanping/article/details/79647337

https://blog.csdn.net/zqz_zqz/article/details/70233767

https://www.cnblogs.com/paddix/p/5405678.html

http://www.reibang.com/p/5da9ef598604

http://www.voidcn.com/article/p-hagongck-wk.html

https://juejin.im/post/5abc9de851882555770c8c72

https://blog.csdn.net/wojiao228925661/article/details/100145157

https://www.cnblogs.com/deltadeblog/p/9559035.html

http://www.reibang.com/p/096d0ed247db

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末橱鹏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子笛辟,更是在濱河造成了極大的恐慌噪馏,老刑警劉巖祟滴,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件振惰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡垄懂,警方通過(guò)查閱死者的電腦和手機(jī)骑晶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)草慧,“玉大人桶蛔,你說(shuō)我怎么就攤上這事÷龋” “怎么了仔雷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我碟婆,道長(zhǎng)电抚,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任竖共,我火速辦了婚禮蝙叛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘公给。我一直安慰自己借帘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布淌铐。 她就那樣靜靜地躺著肺然,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腿准。 梳的紋絲不亂的頭發(fā)上狰挡,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音释涛,去河邊找鬼加叁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛唇撬,可吹牛的內(nèi)容都是我干的它匕。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼窖认,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼豫柬!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起扑浸,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤烧给,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后喝噪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體础嫡,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年酝惧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了榴鼎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晚唇,死狀恐怖巫财,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哩陕,我是刑警寧澤平项,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布赫舒,位于F島的核電站,受9級(jí)特大地震影響闽瓢,放射性物質(zhì)發(fā)生泄漏号阿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一鸳粉、第九天 我趴在偏房一處隱蔽的房頂上張望扔涧。 院中可真熱鬧,春花似錦届谈、人聲如沸枯夜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)湖雹。三九已至,卻和暖如春曙搬,著一層夾襖步出監(jiān)牢的瞬間摔吏,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工纵装, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留征讲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓橡娄,卻偏偏與公主長(zhǎng)得像诗箍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挽唉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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