Java鎖的種類: 公平鎖于样、樂觀鎖疏叨、互斥鎖、分段鎖穿剖、偏向鎖蚤蔓、自旋鎖等

導(dǎo)讀

公平鎖吐辙、非公平鎖

  • 公平鎖是指多個線程在等待同一個鎖時,必須按照申請鎖的先后順序來一次獲得鎖蘸劈。
  • 公平鎖的好處是等待鎖的線程不會餓死昏苏,但是整體效率相對低一些;
  • 非公平鎖的好處是整體效率相對高一些威沫,但是有些線程可能會餓死或者說很早就在等待鎖捷雕,但要等很久才會獲得鎖。
  • 其中的原因是公平鎖是嚴(yán)格按照請求所的順序來排隊獲得鎖的壹甥,而非公平鎖時可以搶占的,即如果在某個時刻有線程需要獲取鎖壶熏,而這個時候剛好鎖可用句柠,那么這個線程會直接搶占,而這時阻塞在等待隊列的線程則不會被喚醒棒假。
  • 公平鎖可以使用new ReentrantLock(true)實現(xiàn)溯职。

對于Java ReentrantLock和而言,通過構(gòu)造函數(shù)指定該鎖是否是公平鎖帽哑,默認(rèn)是非公平鎖谜酒。非公平鎖的優(yōu)點在于吞吐量比公平鎖大。
對于Synchronized而言妻枕,也是一種非公平鎖僻族。由于其并不像ReentrantLock是通過AQS的控制線程對鎖的獲取粘驰, 所以并沒有任何辦法使其變成公平鎖。

互斥鎖/讀寫鎖
上面講的獨享鎖/共享鎖就是一種廣義的說法述么,互斥鎖/讀寫鎖就是具體的實現(xiàn)蝌数。
互斥鎖在Java中的具體實現(xiàn)就是ReentrantLock
讀寫鎖在Java中的具體實現(xiàn)就是ReadWriteLock

可重入鎖

可重入鎖又名遞歸鎖,是指在同一個線程在外層方法獲取鎖的時候度秘,在進入內(nèi)層方法會自動獲取鎖顶伞。說的有點抽象,下面會有一個代碼的示例剑梳。
對于Java ReentrantLock而言, 他的名字就可以看出是一個可重入鎖唆貌,其名字是Re entrant Lock重新進入鎖。
對于Synchronized而言,也是一個可重入鎖垢乙∠橇可重入鎖的一個好處是可一定程度避免死鎖。

樂觀鎖侨赡、悲觀鎖

樂觀鎖/悲觀鎖不是指具體類型的鎖蓖租,而是看待并發(fā)的角度。

  • 悲觀鎖是假定會發(fā)生并發(fā)沖突羊壹,屏蔽一切可能違反數(shù)據(jù)完整性的操作蓖宦。
  • 樂觀鎖是假定不會發(fā)生并發(fā)沖突,只在提交操作時檢測是否違反數(shù)據(jù)完整性油猫。(使用版本號或者時間戳來配合實現(xiàn))稠茂。

獨享鎖、共享鎖

  • 獨享鎖是指該鎖一次只能被一個線程所持有情妖。
  • 共享鎖是指該鎖可被多個線程所持有睬关。

對于Java ReentrantLock而言,其是獨享鎖毡证。但是對于Lock的另一個實現(xiàn)類ReadWriteLock电爹,其讀鎖是共享鎖,其寫鎖是獨享鎖料睛。
讀鎖的共享鎖可保證并發(fā)讀是非常高效的丐箩,讀寫,寫讀 恤煞,寫寫的過程是互斥的屎勘。
獨享鎖與共享鎖也是通過AQS來實現(xiàn)的,通過實現(xiàn)不同的方法居扒,來實現(xiàn)獨享或者共享概漱。
對于Synchronized而言,當(dāng)然是獨享鎖喜喂。

分段鎖

分段鎖其實是一種鎖的設(shè)計瓤摧,并不是具體的一種鎖竿裂,對于ConcurrentHashMap而言,其并發(fā)的實現(xiàn)就是通過分段鎖的形式來實現(xiàn)高效的并發(fā)操作姻灶。
我們以ConcurrentHashMap來說一下分段鎖的含義以及設(shè)計思想铛绰,ConcurrentHashMap中的分段鎖稱為Segment,它即類似于HashMap(JDK7與JDK8中HashMap的實現(xiàn))的結(jié)構(gòu)产喉,即內(nèi)部擁有一個Entry數(shù)組捂掰,數(shù)組中的每個元素又是一個鏈表;同時又是一個ReentrantLock(Segment繼承了ReentrantLock)曾沈。
當(dāng)需要put元素的時候这嚣,并不是對整個hashmap進行加鎖,而是先通過hashcode來知道他要放在那一個分段中塞俱,然后對這個分段進行加鎖姐帚,所以當(dāng)多線程put的時候爬早,只要不是放在一個分段中霉晕,就實現(xiàn)了真正的并行的插入。
但是位迂,在統(tǒng)計size的時候唯蝶,可就是獲取hashmap全局信息的時候九秀,就需要獲取所有的分段鎖才能統(tǒng)計。
分段鎖的設(shè)計目的是細(xì)化鎖的粒度粘我,當(dāng)操作不需要更新整個數(shù)組的時候鼓蜒,就僅僅針對數(shù)組中的一項進行加鎖操作。

偏向鎖/輕量級鎖/重量級鎖

這三種鎖是指鎖的狀態(tài)征字,并且是針對Synchronized都弹。在Java 5通過引入鎖升級的機制來實現(xiàn)高效Synchronized。這三種鎖的狀態(tài)是通過對象監(jiān)視器在對象頭中的字段來表明的匙姜。
偏向鎖是指一段同步代碼一直被一個線程所訪問畅厢,那么該線程會自動獲取鎖。降低獲取鎖的代價氮昧。
輕量級鎖是指當(dāng)鎖是偏向鎖的時候或详,被另一個線程所訪問,偏向鎖就會升級為輕量級鎖郭计,其他線程會通過自旋的形式嘗試獲取鎖,不會阻塞椒振,提高性能昭伸。
重量級鎖是指當(dāng)鎖為輕量級鎖的時候,另一個線程雖然是自旋澎迎,但自旋不會一直持續(xù)下去庐杨,當(dāng)自旋一定次數(shù)的時候选调,還沒有獲取到鎖,就會進入阻塞灵份,該鎖膨脹為重量級鎖仁堪。重量級鎖會讓其他申請的線程進入阻塞,性能降低填渠。

自旋鎖

在Java中弦聂,自旋鎖是指嘗試獲取鎖的線程不會立即阻塞,而是采用循環(huán)的方式去嘗試獲取鎖氛什,這樣的好處是減少線程上下文切換的消耗莺葫,缺點是循環(huán)會消耗CPU。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枪眉,一起剝皮案震驚了整個濱河市捺檬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贸铜,老刑警劉巖堡纬,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蒿秦,居然都是意外死亡烤镐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門渤早,熙熙樓的掌柜王于貴愁眉苦臉地迎上來职车,“玉大人,你說我怎么就攤上這事鹊杖°擦椋” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵骂蓖,是天一觀的道長积瞒。 經(jīng)常有香客問我,道長登下,這世上最難降的妖魔是什么茫孔? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮被芳,結(jié)果婚禮上缰贝,老公的妹妹穿的比我還像新娘。我一直安慰自己畔濒,他們只是感情好剩晴,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般赞弥。 火紅的嫁衣襯著肌膚如雪毅整。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天绽左,我揣著相機與錄音悼嫉,去河邊找鬼。 笑死拼窥,一個胖子當(dāng)著我的面吹牛戏蔑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播闯团,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辛臊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了房交?” 一聲冷哼從身側(cè)響起彻舰,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎候味,沒想到半個月后刃唤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡白群,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年尚胞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帜慢。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡笼裳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出粱玲,到底是詐尸還是另有隱情躬柬,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布抽减,位于F島的核電站允青,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏卵沉。R本人自食惡果不足惜颠锉,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望史汗。 院中可真熱鬧琼掠,春花似錦、人聲如沸停撞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至速挑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間副硅,已是汗流浹背姥宝。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恐疲,地道東北人腊满。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像培己,于是被迫代替她去往敵國和親碳蛋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

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