java.util.concurrent.locks.Lock 接口 源码
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
相關(guān)類圖:
java.util.concurrent.locks.Lock 源碼:?
package java.util.concurrent.locks;import java.util.concurrent.TimeUnit;public interface Lock {void lock();void lockInterruptibly() throws InterruptedException;boolean tryLock();boolean tryLock(long time, TimeUnit unit) throws InterruptedException;void unlock();Condition newCondition(); }接口 Lock
所有已知實(shí)現(xiàn)類:
????ReentrantLock,
????ReentrantReadWriteLock.ReadLock,?
????ReentrantReadWriteLock.WriteLock
? Lock?實(shí)現(xiàn)提供了比使用?synchronized?方法和語句可獲得的更廣泛的鎖定操作。此實(shí)現(xiàn)允許更靈活的結(jié)構(gòu),可以具有差別很大的屬性,可以支持多個相關(guān)的?Condition?對象。
????鎖是控制多個線程對共享資源進(jìn)行訪問的工具。通常,鎖提供了對共享資源的獨(dú)占訪問。一次只能有一個線程獲得鎖,對共享資源的所有訪問都需要首先獲得鎖。不過,某些鎖可能允許對共享資源并發(fā)訪問,如?ReadWriteLock?的讀鎖。
? synchronized?方法或語句的使用提供了對與每個對象相關(guān)的隱式監(jiān)視器鎖的訪問,但卻強(qiáng)制所有鎖獲取和釋放均要出現(xiàn)在一個塊結(jié)構(gòu)中:當(dāng)獲取了多個鎖時,它們必須以相反的順序釋放,且必須在與所有鎖被獲取時相同的詞法范圍內(nèi)釋放所有鎖。
????雖然?synchronized?方法和語句的范圍機(jī)制使得使用監(jiān)視器鎖編程方便了很多,而且還幫助避免了很多涉及到鎖的常見編程錯誤,但有時也需要以更為靈活的方式使用鎖。例如,某些遍歷并發(fā)訪問的數(shù)據(jù)結(jié)果的算法要求使用 "hand-over-hand" 或 "chain locking":獲取節(jié)點(diǎn) A 的鎖,然后再獲取節(jié)點(diǎn) B 的鎖,然后釋放 A 并獲取 C,然后釋放 B 并獲取 D,依此類推。Lock?接口的實(shí)現(xiàn)允許鎖在不同的作用范圍內(nèi)獲取和釋放,并允許以任何順序獲取和釋放多個鎖,從而支持使用這種技術(shù)。
????隨著靈活性的增加,也帶來了更多的責(zé)任。不使用塊結(jié)構(gòu)鎖就失去了使用?synchronized?方法和語句時會出現(xiàn)的鎖自動釋放功能。在大多數(shù)情況下,應(yīng)該使用以下語句:
???? Lock l = ...;
???? l.lock();
???? try {
???????? // access the resource protected by this lock
???? } finally {
???????? l.unlock();
???? }
?
????鎖定和取消鎖定出現(xiàn)在不同作用范圍中時,必須謹(jǐn)慎地確保保持鎖定時所執(zhí)行的所有代碼用 try-finally 或 try-catch 加以保護(hù),以確保在必要時釋放鎖。
? Lock?實(shí)現(xiàn)提供了使用?synchronized?方法和語句所沒有的其他功能,包括提供了一個非塊結(jié)構(gòu)的獲取鎖嘗試 (tryLock())、一個獲取可中斷鎖的嘗試 (lockInterruptibly()) 和一個獲取超時失效鎖的嘗試 (tryLock(long, TimeUnit))。
? Lock?類還可以提供與隱式監(jiān)視器鎖完全不同的行為和語義,如保證排序、非重入用法或死鎖檢測。如果某個實(shí)現(xiàn)提供了這樣特殊的語義,則該實(shí)現(xiàn)必須對這些語義加以記錄。
? ? 注意,Lock?實(shí)例只是普通的對象,其本身可以在?synchronized?代碼塊中作為目標(biāo)使用。為了避免混淆,建議除了在其自身的實(shí)現(xiàn)中之外,決不要在synchronized代碼塊中使用?Lock?實(shí)例作為鎖對象。
方法摘要
| ?void | lock()? ??????????獲取鎖。 |
| ?void | lockInterruptibly()? ??????????如果當(dāng)前線程未被中斷,則獲取鎖。 |
| ?Condition | newCondition()? ??????????返回綁定到此?Lock?實(shí)例的新?Condition?實(shí)例。 |
| ?boolean | tryLock()? ??????????僅在調(diào)用時鎖為空閑狀態(tài)才獲取該鎖。 |
| ?boolean | tryLock(long?time,?TimeUnit?unit)? ??????????如果鎖在給定的等待時間內(nèi)空閑,并且當(dāng)前線程未被中斷,則獲取鎖。 |
| ?void | unlock()? ??????????釋放鎖。 |
?
lock
void lock()????獲取鎖。如果鎖不可用,出于線程調(diào)度目的,將禁用當(dāng)前線程,并且在獲得鎖之前,該線程將一直處于休眠狀態(tài)。
?
lockInterruptibly
void lockInterruptibly() throws InterruptedException????如果當(dāng)前線程未被?中斷,則獲取鎖。
????如果鎖可用,則獲取鎖,并立即返回。
????如果鎖不可用,出于線程調(diào)度目的,將禁用當(dāng)前線程,并且在發(fā)生以下兩種情況之一以前,該線程將一直處于休眠狀態(tài):
- 鎖由當(dāng)前線程獲得,線程會被返回繼續(xù)執(zhí)行
- 其他線程中斷當(dāng)前線程,會拋出InterruptedException,并清除當(dāng)前線程的已中斷狀態(tài)。
????拋出:
????InterruptedException?- 如果在獲取鎖時,當(dāng)前線程被中斷(需要當(dāng)前線程支持對鎖獲取的中斷)。
?
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
????? }
?
????此用法可確保如果獲取了鎖,則會釋放鎖,如果未獲取鎖,則不會試圖將其釋放。
????返回:
????????如果獲取了鎖,則返回?true;否則返回?false。
?
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)前線程,并且當(dāng)前線程支持對鎖獲取的中斷,則將拋出?InterruptedException,并會清除當(dāng)前線程的已中斷狀態(tài);
- 已超過指定的等待時間,此時當(dāng)前線程不再休眠,立即返回值?false。如果 time 小于等于 0,該方法將完全不等待。
????參數(shù):
????time?- 等待鎖的最長時間
????unit?-?time?參數(shù)的時間單位
????返回:
????????如果在等待時間內(nèi)獲得了鎖,則返回?true;如果在獲取鎖前超過了等待時間,則返回?false
????拋出:
????InterruptedException?- 如果在獲取鎖時,當(dāng)前線程被中斷(需要當(dāng)前線程支持對鎖獲取的中斷)
?
unlock
void unlock()????釋放鎖。通常只有鎖的保持者可以釋放它,如果違背了這個限制,可能會拋出(未經(jīng)檢查的)異常。
?
newCondition
Condition newCondition()????返回綁定到此?Lock?實(shí)例的新?Condition?實(shí)例。
????在等待條件前,鎖必須由當(dāng)前線程保持。調(diào)用?Condition.await()?將在等待前以原子方式釋放鎖,并在等待返回前重新獲取鎖。
????返回:
????????用于此?Lock?實(shí)例的新?Condition?實(shí)例
????拋出:
????UnsupportedOperationException?- 如果此?Lock?實(shí)現(xiàn)不支持條件
轉(zhuǎn)載于:https://my.oschina.net/langwanghuangshifu/blog/2874912
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的java.util.concurrent.locks.Lock 接口 源码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: easyui datebox时间控件如何
- 下一篇: [MapReduce_add_4] Ma