Synchronized解析和鎖升級過程

前言:

Synchronized對于Java小伙伴們不陌生了纫事,作為一個java日常開發(fā)中比較常見的的本地鎖刹衫,當然還有ReentrantLock可重入鎖,最初版本中 ReentrantLock 的性能是遠遠強于 Synchronized 的口糕,后續(xù)java在一次次的版本迭代中 對 Synchronized 進行了大量的優(yōu)化缅阳,直到 jdk1.6 之后,兩種鎖的性能已經(jīng)相差無幾景描,甚至 Synchronized 的自動釋放鎖會更好用十办。今天我們主要說一下Synchronized同步鎖

Synchronized使用:

使用Synchronized的時候也很方便有以下倆種方法:
1、直接貼在方法上(鎖住的是當前類的字節(jié)碼文件)
2超棺、貼在代碼塊兒上(鎖住的是對象)

//直接貼在方法上
public synchronized void test1(){
        // TODO
    }
//貼在代碼塊兒上
    public void test2(){
        synchronized (this){
            //todo
        }
    }

那么在程序運行中Synchronized鎖的這一塊代碼發(fā)生了什么向族?

先上圖


image.png
  • 在線程運行過程中,線程先會去搶對象的監(jiān)視器棠绘,這個監(jiān)視器是對象獨有的就相當于一把鑰匙件相,搶到了再扭,那么你就獲得了當前代碼塊的執(zhí)行權
  • 其他沒有搶到的線程就會進入隊列(SynchronizedQueue)當中等待,等待當前線程執(zhí)行完后适肠,釋放鎖霍衫,再去搶監(jiān)視器;
  • 最后當前線程執(zhí)行完畢后通知出隊然后繼續(xù)重復次過程
  • 從 jvm 的角度來看 monitorenter 和 monitorexit 指令代表著代碼的執(zhí)行與結束 侯养。

SynchronizedQueue

  • SynchronizedQueue 是一個比較特殊的隊列,它沒有存儲功能澄干,它的功能就是維護一組線程逛揩,其中每個插入操作必須等待另一個線程的移除操作,同樣任何一個移除操作都需要等待另一個線程的插入操作麸俘。因此隊列內部其實是沒有任何一個元素的辩稽,或者說容量為0;嚴格說并不是一個容器从媚。由于隊列沒有容量逞泄,因此不能進行peek操作,因為只有移除元素的時候才有元素拜效;

jdk1.6以前 Synchronized 是一個重量級鎖:

image.png

這就是為什么說喷众,Synchronized 是一個重量級鎖的原因, 因為每一次鎖的資源都是直接和 cpu 去申請的紧憾,而 cpu 的鎖數(shù)量是固定的 到千,當 cpu 鎖資源使用完后還會進行鎖等待,這是一個非常耗時的操作赴穗。

但是在jdk1.6憔四,針對代碼層面進行了大量的優(yōu)化,也就是我們常說的鎖升級的過程般眉。

image.png
  • 無鎖:對象一開始就是無鎖的狀態(tài)了赵;
  • 偏向鎖:相當于給對象貼了一個標簽(將自己的線程Id存入對象頭中),下次我在進來的時候甸赃,發(fā)現(xiàn)標簽就是我的柿汛,我就可以繼續(xù)使用了
  • 自旋鎖:自旋鎖,說白了就是自旋辑奈,想象一下有一個廁所苛茂,里面有一個人在,你很想上但是只有一個坑位鸠窗,所以你只能徘徊等待妓羊,等那個人出來以后,你就可以使用了 稍计。 這個自旋是使用 cas 來保證原子性的躁绸。
  • 重量級鎖:直接向 cpu 去申請申請鎖 ,其他的線程都進入隊列中等待。

鎖升級是什么時候發(fā)生的净刮?

  • 偏向鎖:一個線程獲取鎖時會由無鎖升級為偏向鎖
  • 自旋鎖:當產(chǎn)生線程競爭時由偏向鎖升級為自旋鎖,想象一下 while(true) ;
  • 重量級鎖:當線程競爭到達一定數(shù)量或超過一定時間時剥哑,晉升為重量級鎖

鎖的信息是記錄在哪里的?

image.png
  • 這張圖是對象頭中 markword 的數(shù)據(jù)結構 淹父,鎖的信息就是在這里存放的株婴,很清楚的表明了鎖在升級的時候鎖信息的變動, 其實就是通過二進制的數(shù)值暑认,來對對象進行一個標記困介,每個數(shù)值代表一種狀態(tài) 。

既然synchronized有鎖升級那么有鎖降級嗎蘸际?

  • 在 HotSpot 虛擬機中是有鎖降級的座哩, 但是僅僅只發(fā)生在 STW 的時候 ,只有垃圾回收線程能夠觀測到它粮彤,也就是說根穷, 在我們正常使用的過程中是不會發(fā)生鎖降級的,只有在 GC 的時候才會降級导坟。

今天就講到這吧屿良,累啦,下回想起來的時候在講吧 喜歡的可以插個旗點贊一下

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末乍迄,一起剝皮案震驚了整個濱河市管引,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌闯两,老刑警劉巖褥伴,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異漾狼,居然都是意外死亡重慢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門逊躁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來似踱,“玉大人,你說我怎么就攤上這事稽煤『搜浚” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵酵熙,是天一觀的道長轧简。 經(jīng)常有香客問我,道長匾二,這世上最難降的妖魔是什么哮独? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任拳芙,我火速辦了婚禮,結果婚禮上皮璧,老公的妹妹穿的比我還像新娘舟扎。我一直安慰自己,他們只是感情好悴务,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布睹限。 她就那樣靜靜地躺著,像睡著了一般讯檐。 火紅的嫁衣襯著肌膚如雪邦泄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天裂垦,我揣著相機與錄音,去河邊找鬼肌索。 笑死蕉拢,一個胖子當著我的面吹牛,可吹牛的內容都是我干的诚亚。 我是一名探鬼主播晕换,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼站宗!你這毒婦竟也來了闸准?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤梢灭,失蹤者是張志新(化名)和其女友劉穎夷家,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敏释,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡库快,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了钥顽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片义屏。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蜂大,靈堂內的尸體忽然破棺而出闽铐,到底是詐尸還是另有隱情,我是刑警寧澤奶浦,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布兄墅,位于F島的核電站,受9級特大地震影響财喳,放射性物質發(fā)生泄漏察迟。R本人自食惡果不足惜斩狱,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扎瓶。 院中可真熱鬧所踊,春花似錦、人聲如沸概荷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽误证。三九已至继薛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間愈捅,已是汗流浹背遏考。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蓝谨,地道東北人灌具。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像譬巫,于是被迫代替她去往敵國和親咖楣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內容