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