java并發(fā)-ReentrantLock的lock和lockInterruptibly的區(qū)別

ReentrantLock的加鎖方法Lock()提供了無(wú)條件地輪詢獲取鎖的方式壳贪,lockInterruptibly()提供了可中斷的鎖獲取方式密末。這兩個(gè)方法的區(qū)別在哪里呢告希?通過(guò)分析源碼可以知道lock方法默認(rèn)處理了中斷請(qǐng)求樟凄,一旦監(jiān)測(cè)到中斷狀態(tài),則中斷當(dāng)前線程薄坏;而lockInterruptibly()則直接拋出中斷異常趋厉,由上層調(diào)用者區(qū)去處理中斷。

1 ?lock操作

? ? ? ?? lock獲取鎖過(guò)程中胶坠,忽略了中斷君账,在成功獲取鎖之后,再根據(jù)中斷標(biāo)識(shí)處理中斷涵但,即selfInterrupt中斷自己。 acquire操作源碼如下:

/**

??*默認(rèn)處理中斷方式是selfInterrupt

?*/??

public?final?void?acquire(int?arg)?{??

if?(!tryAcquire(arg)?&&??

????????acquireQueued(addWaiter(Node.EXCLUSIVE),?arg))??

????????selfInterrupt();??

}??

? ? ? acquireQueued帖蔓,在for循環(huán)中無(wú)條件重試獲取鎖矮瘟,直到成功獲取鎖,同時(shí)返回線程中斷狀態(tài)塑娇。該方法通過(guò)for循正常返回時(shí)澈侠,必定是成功獲取到了鎖。

/**

?*無(wú)條件重試,直到成功返回埋酬,并且記錄中斷狀態(tài)

?*/??

final?boolean?acquireQueued(final?Node?node,?int?arg)?{??

boolean?failed?=?true;??

try?{??

boolean?interrupted?=?false;??

for?(;;)?{??

final?Node?p?=?node.predecessor();??

if?(p?==?head?&&?tryAcquire(arg))?{??

????????????????setHead(node);??

p.next?=null;?//?help?GC??

failed?=false;??

return?interrupted;??

????????????}??

if?(shouldParkAfterFailedAcquire(p,?node)?&&??

????????????????parkAndCheckInterrupt())??

interrupted?=true;??

????????}??

}finally?{??

if?(failed)??

????????????cancelAcquire(node);??

????}??

}??

2 lockInterruptibly操作

? ? ?可中斷加鎖哨啃,即在鎖獲取過(guò)程中不處理中斷狀態(tài)烧栋,而是直接拋出中斷異常,由上層調(diào)用者處理中斷拳球。源碼細(xì)微差別在于鎖獲取這部分代碼审姓,這個(gè)方法與acquireQueue差別在于方法的返回途徑有兩種,一種是for循環(huán)結(jié)束祝峻,正常獲取到鎖魔吐;另一種是線程被喚醒后檢測(cè)到中斷請(qǐng)求,則立即拋出中斷異常莱找,該操作導(dǎo)致方法結(jié)束酬姆。

/**

?????*?Acquires?in?exclusive?interruptible?mode.

?????*?@param?arg?the?acquire?argument

?????*/??

private?void?doAcquireInterruptibly(int?arg)??

throws?InterruptedException?{??

final?Node?node?=?addWaiter(Node.EXCLUSIVE);??

boolean?failed?=?true;??

try?{??

for?(;;)?{??

final?Node?p?=?node.predecessor();??

if?(p?==?head?&&?tryAcquire(arg))?{??

????????????????????setHead(node);??

p.next?=null;?//?help?GC??

failed?=false;??

return;??

????????????????}??

if?(shouldParkAfterFailedAcquire(p,?node)?&&??

????????????????????parkAndCheckInterrupt())??

throw?new?InterruptedException();??

????????????}??

}finally?{??

if?(failed)??

????????????????cancelAcquire(node);??

????????}??

????}??

? ? ?結(jié)論:ReentrantLock的中斷和非中斷加鎖模式的區(qū)別在于:線程嘗試獲取鎖操作失敗后,在等待過(guò)程中奥溺,如果該線程被其他線程中斷了辞色,它是如何響應(yīng)中斷請(qǐng)求的。lock方法會(huì)忽略中斷請(qǐng)求浮定,繼續(xù)獲取鎖直到成功相满;而lockInterruptibly則直接拋出中斷異常來(lái)立即響應(yīng)中斷,由上層調(diào)用者處理中斷壶唤。

? ? ?那么雳灵,為什么要分為這兩種模式呢?這兩種加鎖方式分別適用于什么場(chǎng)合呢闸盔?根據(jù)它們的實(shí)現(xiàn)語(yǔ)義來(lái)理解悯辙,我認(rèn)為lock()適用于鎖獲取操作不受中斷影響的情況,此時(shí)可以忽略中斷請(qǐng)求正常執(zhí)行加鎖操作迎吵,因?yàn)樵摬僮鲀H僅記錄了中斷狀態(tài)(通過(guò)Thread.currentThread().interrupt()操作躲撰,只是恢復(fù)了中斷狀態(tài)為true,并沒有對(duì)中斷進(jìn)行響應(yīng))击费。如果要求被中斷線程不能參與鎖的競(jìng)爭(zhēng)操作拢蛋,則此時(shí)應(yīng)該使用lockInterruptibly方法,一旦檢測(cè)到中斷請(qǐng)求蔫巩,立即返回不再參與鎖的競(jìng)爭(zhēng)并且取消鎖獲取操作(即finally中的cancelAcquire操作)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谆棱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子圆仔,更是在濱河造成了極大的恐慌垃瞧,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坪郭,死亡現(xiàn)場(chǎng)離奇詭異个从,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門嗦锐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嫌松,“玉大人,你說(shuō)我怎么就攤上這事奕污∥幔” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵菊值,是天一觀的道長(zhǎng)外驱。 經(jīng)常有香客問(wèn)我,道長(zhǎng)腻窒,這世上最難降的妖魔是什么昵宇? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮儿子,結(jié)果婚禮上瓦哎,老公的妹妹穿的比我還像新娘。我一直安慰自己柔逼,他們只是感情好蒋譬,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著愉适,像睡著了一般犯助。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上维咸,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天剂买,我揣著相機(jī)與錄音,去河邊找鬼癌蓖。 笑死瞬哼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的租副。 我是一名探鬼主播坐慰,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼用僧!你這毒婦竟也來(lái)了结胀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤责循,失蹤者是張志新(化名)和其女友劉穎糟港,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沼死,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡着逐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年崔赌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了意蛀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耸别。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖县钥,靈堂內(nèi)的尸體忽然破棺而出秀姐,到底是詐尸還是另有隱情,我是刑警寧澤若贮,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布省有,位于F島的核電站,受9級(jí)特大地震影響谴麦,放射性物質(zhì)發(fā)生泄漏蠢沿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一匾效、第九天 我趴在偏房一處隱蔽的房頂上張望舷蟀。 院中可真熱鬧,春花似錦面哼、人聲如沸野宜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)匈子。三九已至,卻和暖如春闯袒,著一層夾襖步出監(jiān)牢的瞬間虎敦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工搁吓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留原茅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓堕仔,卻偏偏與公主長(zhǎng)得像擂橘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子摩骨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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