顯示鎖與隱式鎖的區(qū)別

????????在面試的過程中有可能會問到:在Java并發(fā)編程中惶洲,鎖有兩種實(shí)現(xiàn):使用隱式鎖和使用顯示鎖分別是什么骗炉?兩者的區(qū)別是什么?所謂的顯式鎖和隱式鎖的區(qū)別也就是說說Synchronized和lock(下文就用ReentrantLock來代之lock)的區(qū)別。

本文主要內(nèi)容:將通過七個方面詳細(xì)介紹sync和lock的區(qū)別归园。通過生活case中的X二代和普通人比較大家更容易理解這兩者之間的區(qū)別

Java中隱式鎖:synchronized枯跑;顯式鎖:lock

sync和lock的區(qū)別

一:出身不同

從synchronized和lock的出身(原始的構(gòu)成)來看看兩者的不同惨驶。

synchronized:Java中的關(guān)鍵字,是由JVM來維護(hù)的敛助。是JVM層面的鎖粗卜。

Lock:是JDK5以后才出現(xiàn)的具體的類。使用lock是調(diào)用對應(yīng)的API纳击。是API層面的鎖续扔。

synchronized是底層是通過monitorenter進(jìn)行加鎖(底層是通過monitor對象來完成的,其中的wait/notify等方法也是依賴于monitor對象的焕数。只有在同步塊或者是同步方法中才可以調(diào)用wait/notify等方法的纱昧。因?yàn)橹挥性谕綁K或者是同步方法中,JVM才會調(diào)用monitory對象的)堡赔;通過monitorexit來退出鎖的识脆。

而lock是通過調(diào)用對應(yīng)的API方法來獲取鎖和釋放鎖的。

一句話概述:可以把synchronized理解為官二代或者是星二代善已。從娘胎出來自帶光環(huán)的灼捂。Lock就是我們普通努力上進(jìn)的人。

二:使用方式不同

synchronized是隱式鎖换团。Lock是顯示鎖

所謂的顯示和隱式就是在使用的時候悉稠,使用者要不要手動寫代碼去獲取鎖和釋放鎖的操作。

我們大家都知道艘包,在使用synchronized關(guān)鍵字的時候的猛,我們使用者根本不用寫其他的代碼洒扎,然后程序就能夠獲取鎖和釋放鎖了。那是因?yàn)楫?dāng)synchronized代碼塊執(zhí)行完成之后衰絮,系統(tǒng)會自動的讓程序釋放占用的鎖袍冷。synchronized是由系統(tǒng)維護(hù)的,如果非邏輯問題的話話猫牡,是不會出現(xiàn)死鎖的胡诗。

在使用lock的時候,我們使用者需要手動的獲取和釋放鎖淌友。如果沒有釋放鎖煌恢,就有可能導(dǎo)致出現(xiàn)死鎖的現(xiàn)象。手動獲取鎖方法:lock.lock()震庭。釋放鎖:unlock方法瑰抵。需要配合tyr/finaly語句塊來完成。

兩者用法對比如下:

用生活中的一個case來形容這個不同:官二代和普通人的你在進(jìn)入機(jī)關(guān)大院的時候待遇器联。官二代不需要出示什么證件就可以進(jìn)入二汛,但是你需要手動出示證件才可以進(jìn)入。

三:等待是否可中斷

synchronized是不可中斷的拨拓。除非拋出異畴燃眨或者正常運(yùn)行完成

Lock可以中斷的。中斷方式:

1:調(diào)用設(shè)置超時方法tryLock(long timeout ,timeUnit unit)

2:調(diào)用lockInterruptibly()放到代碼塊中渣磷,然后調(diào)用interrupt()方法可以中斷

生活中小case來理解這一區(qū)別:官二代一般不會做飯婿着。都會去餐廳點(diǎn)餐等待著餐廳出餐。普通人的你既可以去餐廳等待醋界,如果等待時間長的話竟宋,你就可以回去自己做飯了。

四:加鎖的時候是否可以公平

synchronized;非公平鎖

lock:兩者都可以的形纺。默認(rèn)是非公平鎖丘侠。在其構(gòu)造方法的時候可以傳入Boolean值。

true:公平鎖

false:非公平鎖

生活中小case來理解這個區(qū)別:官二代一般都不排隊(duì)挡篓,喜歡插隊(duì)的婉陷。普通人的你雖然也喜歡插隊(duì)。但是如果遇到讓排隊(duì)的情況下官研,你還是會排隊(duì)的秽澳。

五:鎖綁定多個條件來condition

synchronized:沒有。要么隨機(jī)喚醒一個線程戏羽;要么是喚醒所有等待的線程担神。

Lock:用來實(shí)現(xiàn)分組喚醒需要喚醒的線程,可以精確的喚醒始花,而不是像sync那樣妄讯,不能精確喚醒線程孩锡。

六:從性能比較

synchronized是托管給JVM執(zhí)行的,而Lock是java寫的控制鎖的代碼亥贸。在java1.5中躬窜,synchronized是低效能的。因?yàn)檫@是一個重量級操作炕置,需要調(diào)用操作接口荣挨,導(dǎo)致有可能加鎖消耗的系統(tǒng)空間比加鎖以外的操作更多。相比之下使用Java提供的Lock對象朴摊,性能更高一些默垄。但在java1.6之后,發(fā)生了變化甚纲。synchronized在語義上很清晰口锭,可以進(jìn)行很多優(yōu)化,有適自旋介杆,鎖消除鹃操,鎖粗化,輕量級鎖这溅,偏向鎖等组民。導(dǎo)致在Java1.6上synchronized的性能并不比Lock差棒仍。官方也表示悲靴,他們也支持synchronized,在未來版本中還有優(yōu)化余地莫其。

生活小case理解:在我們一般的認(rèn)知中癞尚,官二代一般都是比較坑爹的吧。但是這幾年也有很多官二代或者是富二代改變了態(tài)度乱陡,端正自己態(tài)度浇揩,靠自己能力而不是拼爹了。

七:從使用鎖的方式比較

說到這里憨颠,還是想提一下著兩種機(jī)制的具體區(qū)別胳徽。據(jù)我所知,synchronized原始采用的是CPU悲觀鎖機(jī)制爽彤,即線程獲得的是獨(dú)占鎖养盗。獨(dú)占鎖以為著其他線程只能依靠阻塞來等待線程釋放鎖。而在CPU抓換線程阻塞時會引起線程上下文切換适篙,黨有很多線程競爭鎖的時候往核,會引起CPU頻繁的上下文切換導(dǎo)致效率很低。

而Lock用的是樂觀鎖方式嚷节。所謂樂觀鎖就是聂儒,每次不加鎖而是假設(shè)沒有沖突而去完成某項(xiàng)操作虎锚,如果因?yàn)闆_突失敗就重試,直到成功為止衩婚。樂觀鎖實(shí)現(xiàn)的機(jī)制就是CAS操作(Compare and Swap)窜护。我們可以進(jìn)一步研究ReentrantLock的源代碼,會發(fā)現(xiàn)其中比較重要的獲得鎖的一個方法是compareAndSetState非春。這里其實(shí)就是調(diào)用CPU提供的特殊指令柄慰。

現(xiàn)在的CPU提供了指令,可以自動更改共享數(shù)據(jù)税娜,而且能夠檢測到其他線程的干擾坐搔,而compareAndSet()就是用這些代替了鎖定。這個算法成為非阻塞算法敬矩,意思是一個線程的失敗或者掛起不應(yīng)該影響其他線程的失敗或掛起的算法概行。

我也只是了解到這一步,具體到CPU的算法弧岳,如果感興趣的讀者可以進(jìn)一步進(jìn)行查閱凳忙。若有更好的解釋,可以給我留言禽炬,我也能更好的學(xué)習(xí)一下涧卵。

?


轉(zhuǎn)載自:

Java并發(fā)之顯式鎖和隱式鎖的區(qū)別 - kaizi1992 - 博客園

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市腹尖,隨后出現(xiàn)的幾起案子柳恐,更是在濱河造成了極大的恐慌,老刑警劉巖热幔,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乐设,死亡現(xiàn)場離奇詭異,居然都是意外死亡绎巨,警方通過查閱死者的電腦和手機(jī)近尚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來场勤,“玉大人戈锻,你說我怎么就攤上這事『拖保” “怎么了格遭?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長窗价。 經(jīng)常有香客問我如庭,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任坪它,我火速辦了婚禮骤竹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘往毡。我一直安慰自己蒙揣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布开瞭。 她就那樣靜靜地躺著懒震,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嗤详。 梳的紋絲不亂的頭發(fā)上个扰,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音葱色,去河邊找鬼递宅。 笑死,一個胖子當(dāng)著我的面吹牛苍狰,可吹牛的內(nèi)容都是我干的办龄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼淋昭,長吁一口氣:“原來是場噩夢啊……” “哼俐填!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起翔忽,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤英融,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后呀打,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矢赁,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年贬丛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片给涕。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡豺憔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出够庙,到底是詐尸還是另有隱情恭应,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布耘眨,位于F島的核電站昼榛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏剔难。R本人自食惡果不足惜胆屿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一奥喻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧非迹,春花似錦环鲤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纯命,卻和暖如春西剥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亿汞。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工蔫耽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人留夜。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓匙铡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親碍粥。 傳聞我的和親對象是個殘疾皇子鳖眼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345