多線程之Synchronized筆記

Synchronized的實現(xiàn)原理

對于被Synchronized修飾的方法/代碼塊炊邦,會多出三個匯編指令:monitorEnter(代碼執(zhí)行前)舷夺、monitorExit(代碼執(zhí)行后)、monitorExit(拋出異常時)。
monitorEnter是獲取鎖伞鲫,monitorExit釋放鎖。

為什么每一個對象都能成為鎖签舞,鎖存在什么地方

Synchronized修飾方法秕脓,那么這個鎖就是類層面的鎖,鎖的是當前類的class對象儒搭。對于Synchronized代碼塊吠架,則Synchronized(obj)中的obj就是被鎖的對象。每一個java對象在內(nèi)存中存儲的布局可以分為三塊區(qū)域:對象頭(Header)搂鲫、實例數(shù)據(jù)(Instance Data)和對齊填充(Padding)傍药。而鎖存在于對象頭。 對象頭(Object Header)包括兩部分信息,第一部分用于存儲對象自身的運行時數(shù)據(jù)拐辽, 如哈希碼(HashCode)拣挪、GC分代年齡、鎖狀態(tài)標志俱诸、線程持有的鎖菠劝、偏向線程ID、偏向時間戳等等睁搭,這部分數(shù)據(jù)的長度在32位和64位的虛擬機(暫 不考慮開啟壓縮指針的場景)中分別為32個和64個Bits赶诊,官方稱它為“Mark Word”。對象頭的另外一部分是類型指針园骆,即是對象指向它的類的元數(shù)據(jù)的指針甫何,虛擬機通過這個指針來確定這個對象是哪個類的實例。

獲取鎖的流程

首先在markword中有個鎖標志來表明當前是哪種類型的鎖遇伞,而走不同的流程。
鎖升級和鎖膨脹的流程:偏向鎖->輕量級鎖+自旋鎖->重量級鎖
偏向鎖:為了減少輕量級鎖的性能消耗(輕量級鎖每次申請捶牢、釋放鎖都至少需要一次CAS鸠珠,但偏向鎖只有初始化時需要一次CAS):一定時間內(nèi)只有一個線程執(zhí)行同步代碼,不存在競爭秋麸。在markword中記錄了線程ID和epoch值渐排。線程從無鎖狀態(tài)進入同步代碼塊時判斷有沒有記錄線程ID,有記錄則判斷是不是當前線程ID灸蟆,是就直接獲得鎖驯耻,無記錄則進行CAS操作將當前線程ID存入markword中,操作失敗則存在競爭升級為輕量級鎖炒考。重偏向(待補充)
輕量級鎖:為了減少以下場景的性能消耗:線程無實際競爭或競爭的時間很短(時間內(nèi)自旋可以獲得鎖)可缚。包括系統(tǒng)調(diào)用引起的內(nèi)核態(tài)與用戶態(tài)切換、線程阻塞造成的線程切換等斋枢。將Mark Word中的部分字節(jié)CAS更新指向線程棧中的Lock Record帘靡,如果更新成功,則輕量級鎖獲取成功瓤帚,記錄鎖狀態(tài)為輕量級鎖描姚;否則,說明已經(jīng)有線程獲得了輕量級鎖戈次,此時CAS操作自旋一段時間轩勘,仍然失敗則膨脹為重量級鎖。
重量級鎖:此時會初始化一個objectMonitor對象監(jiān)視器怯邪,markword中的部分字節(jié)會指向這個monitor绊寻。monitor包含以下信息:markword,當前對象,當前線程榛斯,重入次數(shù)观游,cxq隊列,entryList,waitSet等待隊列驮俗。首先線程獲取鎖判斷owner是否為空懂缕,為空則記錄為當前線程,不為空判斷是不是當前線程王凑,是則重入次數(shù)加1搪柑。不是則將線程包裝成ObjectWaiter對象放入cxq隊列,并調(diào)用park掛起這個線程索烹。鎖釋放會根據(jù)策略不同從cxq隊列或entryList中取一個線程去喚醒去再次競爭鎖

wait與notify

wait時線程會被掛起放入waitset隊列并釋放鎖工碾;
notify時從waitSet中取出第一個,根據(jù)Policy的不同百姓,將這個線程放入_EntryList或者_cxq隊列中的起始或末尾位置渊额,然后根據(jù)QMode的不同,將ObjectWaiter從_cxq或者_EntryList中取出后喚醒再次去競爭鎖垒拢。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旬迹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子求类,更是在濱河造成了極大的恐慌奔垦,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尸疆,死亡現(xiàn)場離奇詭異椿猎,居然都是意外死亡,警方通過查閱死者的電腦和手機寿弱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門犯眠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脖捻,你說我怎么就攤上這事阔逼。” “怎么了地沮?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵嗜浮,是天一觀的道長。 經(jīng)常有香客問我摩疑,道長危融,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任雷袋,我火速辦了婚禮吉殃,結(jié)果婚禮上辞居,老公的妹妹穿的比我還像新娘。我一直安慰自己蛋勺,他們只是感情好瓦灶,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抱完,像睡著了一般贼陶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上巧娱,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天碉怔,我揣著相機與錄音,去河邊找鬼禁添。 笑死撮胧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的老翘。 我是一名探鬼主播芹啥,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼铺峭!你這毒婦竟也來了叁征?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤逛薇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后疏虫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體永罚,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年卧秘,在試婚紗的時候發(fā)現(xiàn)自己被綠了呢袱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡翅敌,死狀恐怖羞福,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蚯涮,我是刑警寧澤治专,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站遭顶,受9級特大地震影響张峰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜棒旗,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一喘批、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦饶深、人聲如沸餐曹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽台猴。三九已至,卻和暖如春额湘,著一層夾襖步出監(jiān)牢的瞬間卿吐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工锋华, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嗡官,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓毯焕,卻偏偏與公主長得像衍腥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纳猫,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

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