JavaTM 2 Platform
Standard Ed. 6

java.util.concurrent.locks
介面 Lock

所有已知實作類別:
ReentrantLock, ReentrantReadWriteLock.ReadLock, ReentrantReadWriteLock.WriteLock

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 類別,可能沒有中斷正在進行的 鎖獲取的能力。因此,並不要求實作為所有三種形式的鎖獲取定義相同的保證或語義,也不要求其支持中斷正在進行的鎖獲取。實作必需清楚地對每個鎖定方法所提供的語義和保證進行記錄。還必須遵守此介面中定義的中斷語義,以便為鎖獲取中斷提供支持:完全支持中斷,或僅在進入方法時支持中斷。

由於中斷通常意味著取消,而通常又很少進行中斷檢查,因此,相對於普通方法返回而言,實作可能更喜歡回應某個中斷。即使出現在另一個操作後的中斷可能會釋放執行緒鎖時也是如此。實作應記錄此行為。

從以下版本開始:
1.5
另請參見:
ReentrantLock, Condition, ReadWriteLock

方法摘要
 void lock()
          獲取鎖。
 void lockInterruptibly()
          如果當前執行緒未被中斷,則獲取鎖。
 Condition newCondition()
          返回綁定到此 Lock 實例的新 Condition 實例。
 boolean tryLock()
          僅在調用時鎖為空閒狀態才獲取該鎖。
 boolean tryLock(long time, TimeUnit unit)
          如果鎖在給定的等待時間內空閒,並且當前執行緒未被中斷,則獲取鎖。
 void unlock()
          釋放鎖。
 

方法詳細資訊

lock

void lock()
獲取鎖。

如果鎖不可用,出於執行緒排程目的,將禁用當前執行緒,並且在獲得鎖之前,該執行緒將一直處於休眠狀態。

實作注意事項

Lock 實作可能能夠檢測到鎖的錯誤使用,比如會導致死鎖的調用,在那種環境下還可能拋出一個 (unchecked) 異常。Lock 實作必須對環境和異常型別進行記錄。


lockInterruptibly

void lockInterruptibly()
                       throws InterruptedException
如果當前執行緒未被中斷,則獲取鎖。

如果鎖可用,則獲取鎖,並立即返回。

如果鎖不可用,出於執行緒排程目的,將禁用當前執行緒,並且在發生以下兩種情況之一以前,該執行緒將一直處於休眠狀態:

如果當前執行緒:

則將拋出 InterruptedException,並清除當前執行緒的已中斷狀態。

實作注意事項

在某些實作中可能無法中斷鎖獲取,即使可能,該操作的開銷也很大。開發人員應該知道可能會發生這種情況。在這種情況下,該實作應該對此進行記錄。

相對於普通方法返回而言,實作可能更喜歡回應某個中斷。

Lock 實作可能可以檢測鎖的錯誤用法,例如,某個調用可能導致死鎖,在特定的環境中可能拋出(未經檢查的)異常。該 Lock 實作必須對環境和異常型別進行記錄。

拋出:
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,該方法將完全不等待。

實作注意事項

在某些實作中可能無法中斷鎖獲取,即使可能,該操作的開銷也很大。開發人員應該知道可能會發生這種情況。在這種情況下,該實作應該對此進行記錄。

相對於普通方法返回而言,實作可能更喜歡回應某個中斷,或者報告出現逾時情況。

Lock 實作可能可以檢測鎖的錯誤用法,例如,某個調用可能導致死鎖,在特定的環境中可能拋出(未經檢查的)異常。該 Lock 實作必須對環境和異常型別進行記錄。

參數:
time - 等待鎖的最長時間
unit - time 參數的時間單位
返回:
如果獲得了鎖,則返回 true;如果在獲取鎖前超過了等待時間,則返回 false
拋出:
InterruptedException - 如果在獲取鎖時,當前執行緒被中斷(並且支持對鎖獲取的中斷)

unlock

void unlock()
釋放鎖。

實作注意事項

Lock 實作通常對哪個執行緒可以釋放鎖施加了限制(通常只有鎖的保持者可以釋放它),如果違背了這個限制,可能會拋出(未經檢查的)異常。該 Lock 實作必須對所有限制和異常型別進行記錄。


newCondition

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