synchronize

鎖從宏觀上分類策严,分為悲觀鎖與樂觀鎖穗慕。

樂觀鎖

樂觀鎖是一種樂觀思想,即認為讀多寫少妻导,遇到并發(fā)寫的可能性低逛绵,每次去拿數(shù)據(jù)的時候都認為別人不會修改,所以不會上鎖栗竖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數(shù)據(jù)暑脆,采取在寫時先讀出當前版本號,然后加鎖操作(比較跟上一次的版本號狐肢,如果一樣則更新)添吗,如果失敗則要重復讀-比較-寫的操作。

java中的樂觀鎖基本都是通過CAS操作實現(xiàn)的份名,CAS是一種更新的原子操作碟联,比較當前值跟傳入值是否一樣,一樣則更新僵腺,否則失敗鲤孵。

悲觀鎖

悲觀鎖是就是悲觀思想,即認為寫多辰如,遇到并發(fā)寫的可能性高普监,每次去拿數(shù)據(jù)的時候都認為別人會修改,所以每次在讀寫數(shù)據(jù)的時候都會上鎖琉兜,這樣別人想讀寫這個數(shù)據(jù)就會block直到拿到鎖凯正。java中的悲觀鎖就是Synchronized,AQS框架下的鎖則是先嘗試cas樂觀鎖去獲取鎖,獲取不到豌蟋,才會轉(zhuǎn)換為悲觀鎖廊散,如RetreenLock。

阻塞代價


java的線程是映射到操作系統(tǒng)原生線程之上的梧疲,如果要阻塞或喚醒一個線程就需要操作系統(tǒng)介入允睹,需要在戶態(tài)與核心態(tài)之間切換运准,這種切換會消耗大量的系統(tǒng)資源,因為用戶態(tài)與內(nèi)核態(tài)都有各自專用的內(nèi)存空間缭受,專用的寄存器等胁澳,用戶態(tài)切換至內(nèi)核態(tài)需要傳遞給許多變量、參數(shù)給內(nèi)核贯涎,內(nèi)核也需要保護好用戶態(tài)在切換時的一些寄存器值听哭、變量等慢洋,以便內(nèi)核態(tài)調(diào)用結(jié)束后切換回用戶態(tài)繼續(xù)工作塘雳。

如果線程狀態(tài)切換是一個高頻操作時,這將會消耗很多CPU處理時間普筹;

如果對于那些需要同步的簡單的代碼塊败明,獲取鎖掛起操作消耗的時間比用戶代碼執(zhí)行的時間還要長,這種同步策略顯然非常糟糕的太防。

synchronized會導致爭用不到鎖的線程進入阻塞狀態(tài)妻顶,所以說它是java語言中一個重量級的同步操縱,被稱為重量級鎖蜒车,為了緩解上述性能問題讳嘱,JVM從1.5開始,引入了輕量鎖與偏向鎖酿愧,默認啟用了自旋鎖沥潭,他們都屬于樂觀鎖。

自旋鎖

自旋鎖原理非常簡單嬉挡,如果持有鎖的線程能在很短時間內(nèi)釋放鎖資源钝鸽,那么那些等待競爭鎖的線程就不需要做內(nèi)核態(tài)和用戶態(tài)之間的切換進入阻塞掛起狀態(tài),它們只需要等一等(自旋)庞钢,等持有鎖的線程釋放鎖后即可立即獲取鎖拔恰,這樣就避免用戶線程和內(nèi)核的切換的消耗。

但是線程自旋是需要消耗CPU的基括,說白了就是讓CPU在做無用功颜懊,線程不能一直占用CPU自旋做無用功,所以需要設(shè)定一個自旋等待的最大時間风皿。

如果持有鎖的線程執(zhí)行的時間超過自旋等待的最大時間扔沒有釋放鎖河爹,就會導致其它爭用鎖的線程在最大等待時間內(nèi)還是獲取不到鎖,這時爭用線程會停止自旋進入阻塞狀態(tài)揪阶。

JVM對于自旋周期的選擇昌抠,jdk1.5這個限度是一定的寫死的,在1.6引入了適應(yīng)性自旋鎖鲁僚,適應(yīng)性自旋鎖意味著自旋的時間不在是固定的了炊苫,而是由前一次在同一個鎖上的自旋時間以及鎖的擁有者的狀態(tài)來決定裁厅,基本認為一個線程上下文切換的時間是最佳的一個時間,同時JVM還針對當前CPU的負荷情況做了較多的優(yōu)化

如果平均負載小于CPUs則一直自旋

如果有超過(CPUs/2)個線程正在自旋侨艾,則后來線程直接阻塞

如果正在自旋的線程發(fā)現(xiàn)Owner發(fā)生了變化則延遲自旋時間(自旋計數(shù))或進入阻塞

如果CPU處于節(jié)電模式則停止自旋

自旋時間的最壞情況是CPU的存儲延遲(CPU A存儲了一個數(shù)據(jù)执虹,到CPU B得知這個數(shù)據(jù)直接的時間差)

自旋時會適當放棄線程優(yōu)先級之間的差異

偏向鎖

偏向鎖是jdk1.6引入的一項鎖優(yōu)化,其中的“偏”是偏心的偏唠梨。它的意思就是說袋励,這個鎖會偏向于第一個獲得它的線程,在接下來的執(zhí)行過程中当叭,假如該鎖沒有被其他線程所獲取茬故,沒有其他線程來競爭該鎖,那么持有偏向鎖的線程將永遠不需要進行同步操作蚁鳖。

也就是說:

在此線程之后的執(zhí)行過程中磺芭,如果再次進入或者退出同一段同步塊代碼,并不再需要去進行加鎖或者解鎖操作醉箕,而是會做以下的步驟:

Load-and-test钾腺,也就是簡單判斷一下當前線程id是否與Markword當中的線程id是否一致.

如果一致,則說明此線程已經(jīng)成功獲得了鎖讥裤,繼續(xù)執(zhí)行下面的代碼.

如果不一致放棒,則要檢查一下對象是否還是可偏向,即“是否偏向鎖”標志位的值己英。

如果還未偏向间螟,則利用CAS操作來競爭鎖,也即是第一次獲取鎖時的操作剧辐。

如果此對象已經(jīng)偏向了寒亥,并且不是偏向自己,則說明存在了競爭荧关。此時可能就要根據(jù)另外線程的情況溉奕,可能是重新偏向,也有可能是做偏向撤銷忍啤,但大部分情況下就是升級成輕量級鎖了加勤。

可以看出,偏向鎖是針對于一個線程而言的同波,線程獲得鎖之后就不會再有解鎖等操作了鳄梅,這樣可以省略很多開銷。假如有兩個線程來競爭該鎖話未檩,那么偏向鎖就失效了戴尸,進而升級成輕量級鎖了。

為什么要這樣做呢冤狡?因為經(jīng)驗表明孙蒙,其實大部分情況下项棠,都會是同一個線程進入同一塊同步代碼塊的。這也是為什么會有偏向鎖出現(xiàn)的原因挎峦。

在Jdk1.6中香追,偏向鎖的開關(guān)是默認開啟的,適用于只有一個線程訪問同步塊的場景坦胶。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末透典,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子顿苇,更是在濱河造成了極大的恐慌峭咒,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岖圈,死亡現(xiàn)場離奇詭異讹语,居然都是意外死亡钙皮,警方通過查閱死者的電腦和手機蜂科,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來短条,“玉大人导匣,你說我怎么就攤上這事∪资保” “怎么了贡定?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長可都。 經(jīng)常有香客問我缓待,道長,這世上最難降的妖魔是什么渠牲? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任旋炒,我火速辦了婚禮,結(jié)果婚禮上签杈,老公的妹妹穿的比我還像新娘瘫镇。我一直安慰自己,他們只是感情好答姥,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布铣除。 她就那樣靜靜地躺著,像睡著了一般鹦付。 火紅的嫁衣襯著肌膚如雪尚粘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天敲长,我揣著相機與錄音郎嫁,去河邊找鬼互捌。 笑死,一個胖子當著我的面吹牛行剂,可吹牛的內(nèi)容都是我干的秕噪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼厚宰,長吁一口氣:“原來是場噩夢啊……” “哼腌巾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起铲觉,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤澈蝙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后撵幽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灯荧,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年盐杂,在試婚紗的時候發(fā)現(xiàn)自己被綠了逗载。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡链烈,死狀恐怖厉斟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情强衡,我是刑警寧澤擦秽,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站漩勤,受9級特大地震影響感挥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜越败,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一触幼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧眉尸,春花似錦域蜗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至袱蜡,卻和暖如春丝蹭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坪蚁。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工奔穿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留镜沽,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓贱田,卻偏偏與公主長得像缅茉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子男摧,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355