鎖 2020-12-30

一: synchronized的執(zhí)行過程: 偏向鎖->輕量級自旋鎖->重量級鎖
  1. 檢測Mark Word里面是不是當前線程的ID菠发,如果是,表示當前線程處于偏向鎖

  2. 如果不是钞它,則使用CAS將當前線程的ID替換Mard Word蔑担,如果成功則表示當前線程獲得偏向鎖,置偏向標志位1

  3. 如果失敗章贞,則說明發(fā)生競爭,撤銷偏向鎖非洲,進而升級為輕量級鎖鸭限。

  4. 當前線程使用CAS將對象頭的Mark Word替換為鎖記錄指針蜕径,如果成功,當前線程獲得鎖

  5. 如果失敗败京,表示其他線程競爭鎖兜喻,當前線程便嘗試使用自旋來獲取鎖。

  6. 如果自旋成功則依然處于輕量級狀態(tài)赡麦。

  7. 如果自旋失敗朴皆,則升級為重量級鎖。

首先試圖加偏向鎖,修改對象頭的線程id,如果失敗,說明存在競爭,進而使用輕量級鎖進行自旋獲取鎖,自旋失敗泛粹,則升級為重量級鎖


二: 鎖的類型
捕獲.PNG
  1. 公平鎖和非公平鎖

公平鎖是嚴格按照請求所的順序來排隊獲得鎖的遂铡,而非公平鎖時可以搶占的

  1. 輕量級鎖和重量級鎖

    輕量級自旋 不進行操作系統(tǒng)用戶態(tài)和內核態(tài)的轉換,消耗cpu;重量級鎖相反

  2. 讀寫鎖和互斥鎖

  3. 悲觀鎖和樂觀鎖

    悲觀鎖:假定會發(fā)生并發(fā)沖突,屏蔽一切可能違反數據完整性的操作戚扳。 樂觀鎖:假定不會發(fā)生并發(fā)沖突忧便,只在提交操作時檢測是否違反數據完整性。(使用版本號或者時間戳來配合實現)

  4. 可重入鎖 ReentrantLock

    通俗來說:當線程請求一個由其它線程持有的對象鎖時帽借,該線程會阻塞珠增,而當線程請求由自己持有的對象鎖時,如果該鎖是重入鎖砍艾,請求就會成功蒂教,否則阻塞。

    實現原理:每一個鎖關聯(lián)一個線程持有者和計數器脆荷,當計數器為 0 時表示該鎖沒有被任何線程持有凝垛,那么任何線程都可能獲得該鎖而調用相應的方法;當某一線程請求成功后蜓谋,JVM會記下鎖的持有線程梦皮,并且將計數器置為 1;此時其它線程請求該鎖桃焕,則必須等待剑肯;而該持有鎖的線程如果再次請求這個鎖,就可以再次拿到這個鎖观堂,同時計數器會遞增让网;當線程退出同步代碼塊時,計數器會遞減师痕,如果計數器為0溃睹,則釋放該鎖。


三: 分布式標識 實現的冪等 VS 鎖

標識: 根據標識決定是否執(zhí)行,無法執(zhí)行可以返回也可以自旋等待

鎖: 對象,資源;

思考:多個請求 可能相同id,可能不同id,要求相同id順序執(zhí)行,不同id可以并發(fā)??(不是鎖對象,而是根據標識判斷執(zhí)行邏輯)

使用id作為標識位來實現,存儲了該標識則阻塞等待

所以 冪等:拿到標識執(zhí)行,拿不到則返回不執(zhí)行(可以不做)

鎖:拿到標識執(zhí)行,拿不到則阻塞或者自旋等待執(zhí)行(必須要做)


四: 死鎖
  • 互斥條件:一個資源每次只能被一個進程使用胰坟。

  • 請求與保持條件:一個進程因請求資源而阻塞時因篇,對已獲得的資源保持不放。

  • 不剝奪條件:進程已獲得的資源,在未使用完之前惜犀,不能強行剝奪铛碑。

  • 循環(huán)等待條件:若干進程之間形成一種頭尾相接的循環(huán)等待資源關系狠裹。

概括:一個資源每次只能被一個線程;線程沒使用完之前,不能剝奪;線程請求其他資源,不會放棄已獲取的資源;線程間為等待資源形成循環(huán)

避免死鎖: 預防 與 后置處理

避免死鎖最簡單的方法就是阻止循環(huán)等待條件虽界,將系統(tǒng)中所有的資源設置標志位、排序涛菠,規(guī)定所有的進程申請資源必須以一定的順序做操作來避免死鎖(阻止循環(huán)等待條件,資源排序按順序獲取)


五: CAS AQS(AbstractQueuedSynchronizer類:抽象隊列同步器)

AQS: state ThreadId FIFO

  • 獲取鎖的過程

    1. 當線程調用acquire()申請獲取鎖資源莉御,如果成功,則進入臨界區(qū)俗冻。

    2. 當獲取鎖失敗時礁叔,則進入一個FIFO等待隊列,然后被掛起等待喚醒迄薄。

    3. 當隊列中的等待線程被喚醒以后就重新嘗試獲取鎖資源琅关,如果成功則進入臨界區(qū),否則繼續(xù)掛起等待讥蔽。

  • 釋放鎖過程:

    1. 當線程調用release()進行鎖資源釋放時涣易,如果沒有其他線程在等待鎖資源,則釋放完成冶伞。

    2. 如果隊列中有其他等待鎖資源的線程需要喚醒新症,則喚醒隊列中的第一個等待節(jié)點(先入先出)。(釋放鎖時去喚醒隊列中的阻塞線程嘗試獲取鎖**)


?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末响禽,一起剝皮案震驚了整個濱河市徒爹,隨后出現的幾起案子,更是在濱河造成了極大的恐慌芋类,老刑警劉巖隆嗅,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異侯繁,居然都是意外死亡胖喳,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門巫击,熙熙樓的掌柜王于貴愁眉苦臉地迎上來禀晓,“玉大人,你說我怎么就攤上這事坝锰〈饫粒” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵顷级,是天一觀的道長凫乖。 經常有香客問我,道長,這世上最難降的妖魔是什么帽芽? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任删掀,我火速辦了婚禮,結果婚禮上导街,老公的妹妹穿的比我還像新娘披泪。我一直安慰自己,他們只是感情好搬瑰,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布款票。 她就那樣靜靜地躺著,像睡著了一般泽论。 火紅的嫁衣襯著肌膚如雪艾少。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天翼悴,我揣著相機與錄音渺蒿,去河邊找鬼酥泞。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的嫌佑。 我是一名探鬼主播霎槐,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼宦焦,長吁一口氣:“原來是場噩夢啊……” “哼须妻!你這毒婦竟也來了?” 一聲冷哼從身側響起煞额,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤思恐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后膊毁,有當地人在樹林里發(fā)現了一具尸體胀莹,經...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年婚温,在試婚紗的時候發(fā)現自己被綠了描焰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡栅螟,死狀恐怖荆秦,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情力图,我是刑警寧澤步绸,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站吃媒,受9級特大地震影響瓤介,放射性物質發(fā)生泄漏吕喘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一刑桑、第九天 我趴在偏房一處隱蔽的房頂上張望氯质。 院中可真熱鬧,春花似錦祠斧、人聲如沸闻察。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜓陌。三九已至觅彰,卻和暖如春吩蔑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背填抬。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工烛芬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人飒责。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓赘娄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宏蛉。 傳聞我的和親對象是個殘疾皇子遣臼,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容