|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
public interface Lock
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
語句中作為目標使用。獲取 Lock
實例的監視器鎖與調用該實例的任何 lock()
方法沒有特別的關係。為了避免混淆,建議除了在其自身的實作中之外,決不要以這種方式使用 Lock
實例。
除非另有說明,否則為任何參數傳遞 null
值都將導致拋出 NullPointerException
。
所有 Lock
實作都必須 實施與內置監視器鎖提供的相同記憶體同步語義,如
The Java Language Specification, Third Edition (17.4 Memory Model) 中所描述的:
lock
操作與成功的 Lock 操作具有同樣的記憶體同步效應。
unlock
操作與成功的 Unlock 操作具有同樣的記憶體同步效應。
三種形式的鎖獲取(可中斷、不可中斷和定時)在其性能特徵、排序保證或其他實作質量上可能會有所不同。而且,對於給定的 Lock
類別,可能沒有中斷正在進行的 鎖獲取的能力。因此,並不要求實作為所有三種形式的鎖獲取定義相同的保證或語義,也不要求其支持中斷正在進行的鎖獲取。實作必需清楚地對每個鎖定方法所提供的語義和保證進行記錄。還必須遵守此介面中定義的中斷語義,以便為鎖獲取中斷提供支持:完全支持中斷,或僅在進入方法時支持中斷。
由於中斷通常意味著取消,而通常又很少進行中斷檢查,因此,相對於普通方法返回而言,實作可能更喜歡回應某個中斷。即使出現在另一個操作後的中斷可能會釋放執行緒鎖時也是如此。實作應記錄此行為。
ReentrantLock
,
Condition
,
ReadWriteLock
方法摘要 | |
---|---|
void |
lock()
獲取鎖。 |
void |
lockInterruptibly()
如果當前執行緒未被中斷,則獲取鎖。 |
Condition |
newCondition()
返回綁定到此 Lock 實例的新 Condition 實例。 |
boolean |
tryLock()
僅在調用時鎖為空閒狀態才獲取該鎖。 |
boolean |
tryLock(long time,
TimeUnit unit)
如果鎖在給定的等待時間內空閒,並且當前執行緒未被中斷,則獲取鎖。 |
void |
unlock()
釋放鎖。 |
方法詳細資訊 |
---|
void lock()
如果鎖不可用,出於執行緒排程目的,將禁用當前執行緒,並且在獲得鎖之前,該執行緒將一直處於休眠狀態。
實作注意事項
Lock
實作可能能夠檢測到鎖的錯誤使用,比如會導致死鎖的調用,在那種環境下還可能拋出一個 (unchecked) 異常。Lock
實作必須對環境和異常型別進行記錄。
void lockInterruptibly() throws InterruptedException
如果鎖可用,則獲取鎖,並立即返回。
如果鎖不可用,出於執行緒排程目的,將禁用當前執行緒,並且在發生以下兩種情況之一以前,該執行緒將一直處於休眠狀態:
如果當前執行緒:
InterruptedException
,並清除當前執行緒的已中斷狀態。
實作注意事項
在某些實作中可能無法中斷鎖獲取,即使可能,該操作的開銷也很大。開發人員應該知道可能會發生這種情況。在這種情況下,該實作應該對此進行記錄。
相對於普通方法返回而言,實作可能更喜歡回應某個中斷。
Lock
實作可能可以檢測鎖的錯誤用法,例如,某個調用可能導致死鎖,在特定的環境中可能拋出(未經檢查的)異常。該 Lock
實作必須對環境和異常型別進行記錄。
InterruptedException
- 如果在獲取鎖時,當前執行緒被中斷(並且支持對鎖獲取的中斷)。boolean tryLock()
如果鎖可用,則獲取鎖,並立即返回值 true
。如果鎖不可用,則此方法將立即返回值 false
。
此方法的典型使用語句如下:
Lock lock = ...; if (lock.tryLock()) { try { // manipulate protected state } finally { lock.unlock(); } } else { // perform alternative actions }此用法可確保如果獲取了鎖,則會釋放鎖,如果未獲取鎖,則不會試圖將其釋放。
true
;否則返回 false
。boolean tryLock(long time, TimeUnit unit) throws InterruptedException
如果鎖可用,則此方法將立即返回值 true
。如果鎖不可用,出於執行緒排程目的,將禁用當前執行緒,並且在發生以下三種情況之一前,該執行緒將一直處於休眠狀態:
如果獲得了鎖,則返回值 true
。
如果當前執行緒:
InterruptedException
,並會清除當前執行緒的已中斷狀態。
如果超過了指定的等待時間,則將返回值 false
。如果 time 小於等於 0,該方法將完全不等待。
實作注意事項
在某些實作中可能無法中斷鎖獲取,即使可能,該操作的開銷也很大。開發人員應該知道可能會發生這種情況。在這種情況下,該實作應該對此進行記錄。
相對於普通方法返回而言,實作可能更喜歡回應某個中斷,或者報告出現逾時情況。
Lock
實作可能可以檢測鎖的錯誤用法,例如,某個調用可能導致死鎖,在特定的環境中可能拋出(未經檢查的)異常。該 Lock
實作必須對環境和異常型別進行記錄。
time
- 等待鎖的最長時間unit
- time
參數的時間單位
true
;如果在獲取鎖前超過了等待時間,則返回 false
InterruptedException
- 如果在獲取鎖時,當前執行緒被中斷(並且支持對鎖獲取的中斷)void unlock()
實作注意事項
Lock
實作通常對哪個執行緒可以釋放鎖施加了限制(通常只有鎖的保持者可以釋放它),如果違背了這個限制,可能會拋出(未經檢查的)異常。該 Lock
實作必須對所有限制和異常型別進行記錄。
Condition newCondition()
Lock
實例的新 Condition
實例。
在等待條件前,鎖必須由當前執行緒保持。調用 Condition.await()
將在等待前以原子方式釋放鎖,並在等待返回前重新獲取鎖。
實作注意事項
Condition
實例的具體操作依賴於 Lock
實作,並且該實作必須對此加以記錄。
Lock
實例的新 Condition
實例
UnsupportedOperationException
- 如果此 Lock
實作不支持條件
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。