可中断锁
可中斷鎖:顧名思義,就是可以相應(yīng)中斷的鎖。
在Java中,synchronized就不是可中斷鎖,而Lock是可中斷鎖。
如果某一線程A正在執(zhí)行鎖中的代碼,另一線程B正在等待獲取該鎖,可能由于等待時間過長,線程B不想等待了,想先處理其他事情,我們可以讓它中斷自己或者在別的線程中中斷它,這種就是可中斷鎖。
在前面演示lockInterruptibly()的用法時已經(jīng)體現(xiàn)了Lock的可中斷性。
線程在調(diào)用lock方法來獲得另一個線程所持有的鎖的時候,很可能發(fā)生阻塞。應(yīng)該更加謹慎地申請鎖。tryLock方法試圖申請一個鎖,在成功獲得鎖后返回true,否則,立即返回false,而且線程可以立即離開去做其他事。
可以調(diào)用tryLock時,使用超時參數(shù)。
lock方法不能被中斷。如果一個線程在等待獲得一個鎖時被中斷,中斷線程在獲得鎖之前一直處于阻塞狀態(tài)。如果出現(xiàn)死鎖,那么,lock方法就無法終止。
API介紹:
Lock接口
1、tryLock
boolean tryLock()
僅在調(diào)用時鎖為空閑狀態(tài)才獲取該鎖。 ?
如果鎖可用,則獲取鎖,并立即返回值 true。如果鎖不可用,則此方法將立即返回值 false。
此方法的典型使用語句如下:
??????Lock?lock?=?...;??????if?(lock.tryLock())?{??????????try?{//?manipulate?protected?state}?finally?{lock.unlock();}}?else?{//?perform?alternative?actions}12345678910此用法可確保如果獲取了鎖,則會釋放鎖,如果未獲取鎖,則不會試圖將其釋放。
返回:
如果獲取了鎖,則返回 true;否則返回 false。
2、tryLock
boolean tryLock(long time,
? ? ? ? ? ? ? ?TimeUnit unit)
? ? ? ? ? ? ? ?throws InterruptedException
如果鎖在給定的等待時間內(nèi)空閑,并且當(dāng)前線程未被中斷,則獲取鎖。 ?
如果鎖可用,則此方法將立即返回值 true。如果鎖不可用,出于線程調(diào)度目的,將禁用當(dāng)前線程,并且在發(fā)生以下三種情況之一前,該線程將一直處于休眠狀態(tài):
鎖由當(dāng)前線程獲得;或者 ?
其他某個線程中斷當(dāng)前線程,并且支持對鎖獲取的中斷;或者 ?
已超過指定的等待時間 ?
如果獲得了鎖,則返回值 true。
如果當(dāng)前線程:
在進入此方法時已經(jīng)設(shè)置了該線程的中斷狀態(tài);或者 ?
在獲取鎖時被中斷,并且支持對鎖獲取的中斷, ?
則將拋出 InterruptedException,并會清除當(dāng)前線程的已中斷狀態(tài)。 ?
如果超過了指定的等待時間,則將返回值 false。如果 time 小于等于 0,該方法將完全不等待。
實現(xiàn)注意事項
在某些實現(xiàn)中可能無法中斷鎖獲取,即使可能,該操作的開銷也很大。程序員應(yīng)該知道可能會發(fā)生這種情況。在這種情況下,該實現(xiàn)應(yīng)該對此進行記錄。
相對于普通方法返回而言,實現(xiàn)可能更喜歡響應(yīng)某個中斷,或者報告出現(xiàn)超時情況。
Lock 實現(xiàn)可能可以檢測鎖的錯誤用法,例如,某個調(diào)用可能導(dǎo)致死鎖,在特定的環(huán)境中可能拋出(未經(jīng)檢查的)異常。該 Lock 實現(xiàn)必須對環(huán)境和異常類型進行記錄。
參數(shù):
time - 等待鎖的最長時間
unit - time 參數(shù)的時間單位 ?
返回:
如果獲得了鎖,則返回 true;如果在獲取鎖前超過了等待時間,則返回 false ?
拋出: ?
InterruptedException - 如果在獲取鎖時,當(dāng)前線程被中斷(并且支持對鎖獲取的中斷)
3、lockInterruptibly
void lockInterruptibly()
? ? ? ? ? ? ? ? ? ? ? throws InterruptedException
如果當(dāng)前線程未被中斷,則獲取鎖。 ?
如果鎖可用,則獲取鎖,并立即返回。
如果鎖不可用,出于線程調(diào)度目的,將禁用當(dāng)前線程,并且在發(fā)生以下兩種情況之一以前,該線程將一直處于休眠狀態(tài):
鎖由當(dāng)前線程獲得;或者 ?
其他某個線程中斷當(dāng)前線程,并且支持對鎖獲取的中斷。 ?
如果當(dāng)前線程:
在進入此方法時已經(jīng)設(shè)置了該線程的中斷狀態(tài);或者 ?
在獲取鎖時被中斷,并且支持對鎖獲取的中斷, ?
則將拋出 InterruptedException,并清除當(dāng)前線程的已中斷狀態(tài)。 ?
實現(xiàn)注意事項
在某些實現(xiàn)中可能無法中斷鎖獲取,即使可能,該操作的開銷也很大。程序員應(yīng)該知道可能會發(fā)生這種情況。在這種情況下,該實現(xiàn)應(yīng)該對此進行記錄。
相對于普通方法返回而言,實現(xiàn)可能更喜歡響應(yīng)某個中斷。
Lock 實現(xiàn)可能可以檢測鎖的錯誤用法,例如,某個調(diào)用可能導(dǎo)致死鎖,在特定的環(huán)境中可能拋出(未經(jīng)檢查的)異常。該 Lock 實現(xiàn)必須對環(huán)境和異常類型進行記錄。
拋出: ?
InterruptedException - 如果在獲取鎖時,當(dāng)前線程被中斷(并且支持對鎖獲取的中斷)。
?
超強干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達旦的技術(shù)人生總結(jié)
- 上一篇: 循环尝试,不释放CPU
- 下一篇: 我们如何才能让锁变得更好用?