Synchornized

image.png

Synchornized做了哪些優(yōu)化信峻?

synchornized底層都是使用monitorenter和monitorexit指令實現(xiàn)的衩侥,進入同步塊就意味著拿到了monitorenter的所有權(quán)涛舍,而持有這個monitorenter所有權(quán)的線程就可以執(zhí)行代碼塊,沒有持有的線程就都在外面等著锐极,早期JDK1.6之前都是使用阻塞線程的方式等待鎖的釋放盒齿,但很多輕量級的同步塊,迅速執(zhí)行完的代碼塊來說枚荣,這個鎖就太重了碗脊,所以就在重量級鎖的基礎(chǔ)上引入了偏向鎖和輕量級鎖這兩個狀態(tài),如果當前的synchornized加鎖的情況下面橄妆,他這個偏向鎖衙伶,是當前的對象沒有競爭,而且總是由同一個線程獲得鎖的時候就會進入偏向鎖的狀態(tài)害碾,一旦產(chǎn)生了競爭就會膨脹為輕量級鎖矢劲,如果輕量級鎖自旋超過了一定次數(shù)又會膨脹為重量級鎖。

synchronized的執(zhí)行過程:

  1. 檢測Mark Word里面是不是當前線程的ID慌随,如果是芬沉,表示當前線程處于偏向鎖
  2. 如果不是,則使用CAS將當前線程的ID替換Mard Word阁猜,如果成功則表示當前線程獲得偏向鎖丸逸,置偏向標志位1
  3. 如果失敗,則說明發(fā)生競爭蹦漠,撤銷偏向鎖椭员,進而升級為輕量級鎖。
  4. 當前線程使用CAS將對象頭的Mark Word替換為鎖記錄指針笛园,如果成功隘击,當前線程獲得鎖
  5. 如果失敗,表示其他線程競爭鎖研铆,當前線程便嘗試使用自旋來獲取鎖埋同。
  6. 如果自旋成功則依然處于輕量級狀態(tài)。
  7. 如果自旋失敗棵红,則升級為重量級鎖凶赁。

Monitor 原理

每個 Java 對象都可以關(guān)聯(lián)一個Monitor對象,如果使用 synchronized 給對象上鎖(重量級)之后,該對象頭的
Mark Word 中就被設(shè)置指向Monitor 對象的指針虱肄。
Monitor 結(jié)構(gòu)如下:


image.png

剛開始 Monitor 中 Owner 為 null致板。
當 Thread-2 執(zhí)行 synchronized(obj) 就會將 Monitor 的所有者 Owner 置為 Thread-2,Monitor中只能有一個Owner咏窿。
在 Thread-2上鎖的過程中斟或,如果 Thread-3,Thread-4集嵌,Thread-5 也來執(zhí)行 synchronized(obj)萝挤,就會進入
EntryList BLOCKED。
Thread-2 執(zhí)行完同步代碼塊的內(nèi)容根欧,然后喚醒EntryList 中等待的線程來競爭鎖怜珍,競爭的時是非公平的。
圖中 WaitSet 中的 Thread-0凤粗,Thread-1 是之前獲得過鎖酥泛,但條件不滿足進入調(diào)用wait()方法進入 WAITING 狀態(tài)的線程。當調(diào)用notifyAll()方法之后侈沪,WaitSet中的 Thread-0揭璃,Thread-1 進入EntryList BLOCKED。

自適應(yīng)自旋鎖

自旋鎖優(yōu)點在于它避免一些線程的掛起和恢復操作亭罪,因為掛起線程和恢復線程都需要從用戶態(tài)轉(zhuǎn)入內(nèi)核態(tài)瘦馍,這個過程是比較慢的,所以通過自旋的方式可以一定程度上避免線程掛起和恢復所造成的性能開銷
但是应役,如果長時間自旋還獲取不到鎖情组,那么也會造成一定的資源浪費,所以我們通常會給自旋設(shè)置一個固定的值來避免一直自旋的性能開銷
自適應(yīng)自旋鎖是指箩祥,線程自旋的次數(shù)不再是固定的值院崇,而是一個動態(tài)改變的值。簡單來說袍祖,如果線程自旋成功了底瓣,則下次自旋的次數(shù)會增多,如果失敗蕉陋,下次自旋的次數(shù)會減少捐凭。

上面幾種鎖都是JVM自己內(nèi)部實現(xiàn),當我們執(zhí)行synchronized同步塊的時候jvm會根據(jù)啟用的鎖和當前線程的爭用情況凳鬓,決定如何執(zhí)行同步操作茁肠;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缩举,隨后出現(xiàn)的幾起案子垦梆,更是在濱河造成了極大的恐慌匹颤,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件托猩,死亡現(xiàn)場離奇詭異印蓖,居然都是意外死亡,警方通過查閱死者的電腦和手機京腥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門另伍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绞旅,你說我怎么就攤上這事∥峦В” “怎么了因悲?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長勺爱。 經(jīng)常有香客問我晃琳,道長,這世上最難降的妖魔是什么琐鲁? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任卫旱,我火速辦了婚禮,結(jié)果婚禮上围段,老公的妹妹穿的比我還像新娘顾翼。我一直安慰自己,他們只是感情好奈泪,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布适贸。 她就那樣靜靜地躺著,像睡著了一般涝桅。 火紅的嫁衣襯著肌膚如雪拜姿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天冯遂,我揣著相機與錄音蕊肥,去河邊找鬼。 笑死蛤肌,一個胖子當著我的面吹牛壁却,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播寻定,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼儒洛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狼速?” 一聲冷哼從身側(cè)響起琅锻,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后恼蓬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惊完,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年处硬,在試婚紗的時候發(fā)現(xiàn)自己被綠了小槐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡荷辕,死狀恐怖凿跳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情疮方,我是刑警寧澤控嗜,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站骡显,受9級特大地震影響疆栏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惫谤,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一壁顶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧溜歪,春花似錦若专、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拯腮,卻和暖如春窖式,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背动壤。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工萝喘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人琼懊。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓阁簸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哼丈。 傳聞我的和親對象是個殘疾皇子启妹,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

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