JavaTM 2 Platform
Standard Ed. 6

java.util.concurrent.locks
類別 LockSupport

java.lang.Object
  繼承者 java.util.concurrent.locks.LockSupport

public class LockSupport
extends Object

用來創建鎖和其他同步類別的基本執行緒阻塞原語。

此類別以及每個使用它的執行緒與一個許可關聯(從 Semaphore 類別的意義上說)。如果該許可可用,並且可在進程中使用,則調用 park 將立即返回;否則可能 阻塞。如果許可尚不可用,則可以調用 unpark 使其可用。(但與 Semaphore 不同的是,許可不能累積,並且最多只能有一個許可。)

parkunpark 方法提供了阻塞和解除阻塞執行緒的有效方法,並且不會遇到導致過時方法 Thread.suspendThread.resume 因為以下目的變得不可用的問題:由於許可的存在,調用 park 的執行緒和另一個試圖將其 unpark 的執行緒之間的競爭將保持活性。此外,如果調用者執行緒被中斷,並且支持逾時,則 park 將返回。park 方法還可以在其他任何時間“毫無理由”地返回,因此通常必須在重新檢查返回條件的循環裡調用此方法。從這個意義上說,park 是“忙碌等待”的一種優化,它不會浪費這麼多的時間進行自旋,但是必須將它與 unpark 配對使用才更高效。

三種形式的 park 還各自支持一個 blocker 物件參數。此物件在執行緒受阻塞時被記錄,以允許監視工具和診斷工具確定執行緒受阻塞的原因。(這樣的工具可以使用方法 getBlocker(java.lang.Thread) 存取 blocker。)建議最好使用這些形式,而不是不帶此參數的原始形式。在鎖實作中提供的作為 blocker 的普通參數是 this

這些方法被設計用來作為創建高層級同步實用工具的工具,對於大多數共時控制應用程序而言,它們本身並不是很有用。park 方法僅設計用於以下形式的建構:

while (!canProceed()) { ... LockSupport.park(this); }
在這裡,在調用 park 之前,canProceed 和其他任何動作都不會鎖定或阻塞。因為每個執行緒只與一個許可關聯,park 的任何中間使用都可能干擾其預期效果。

範例用法。 以下是一個先進先出 (first-in-first-out) 非重入鎖類別的框架。

class FIFOMutex {
   private final AtomicBoolean locked = new AtomicBoolean(false);
   private final Queue<Thread> waiters
     = new ConcurrentLinkedQueue<Thread>();

   public void lock() {
     boolean wasInterrupted = false;
     Thread current = Thread.currentThread();
     waiters.add(current);

     // Block while not first in queue or cannot acquire lock
     while (waiters.peek() != current ||
            !locked.compareAndSet(false, true)) {
        LockSupport.park(this);
        if (Thread.interrupted()) // ignore interrupts while waiting
          wasInterrupted = true;
     }

     waiters.remove();
     if (wasInterrupted)          // reassert interrupt status on exit
        current.interrupt();
   }

   public void unlock() {
     locked.set(false);
     LockSupport.unpark(waiters.peek());
   }
 }


方法摘要
static Object getBlocker(Thread t)
          返回提供給最近一次尚未解除阻塞的 park 方法調用的 blocker 物件,如果該調用不受阻塞,則返回 null。
static void park()
          為了執行緒排程,禁用當前執行緒,除非許可可用。
static void park(Object blocker)
          為了執行緒排程,在許可可用之前禁用當前執行緒。
static void parkNanos(long nanos)
          為了執行緒排程禁用當前執行緒,最多等待指定的等待時間,除非許可可用。
static void parkNanos(Object blocker, long nanos)
          為了執行緒排程,在許可可用前禁用當前執行緒,並最多等待指定的等待時間。
static void parkUntil(long deadline)
          為了執行緒排程,在指定的時限前禁用當前執行緒,除非許可可用。
static void parkUntil(Object blocker, long deadline)
          為了執行緒排程,在指定的時限前禁用當前執行緒,除非許可可用。
static void unpark(Thread thread)
          如果給定執行緒的許可尚不可用,則使其可用。
 
從類別 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

方法詳細資訊

unpark

public static void unpark(Thread thread)
如果給定執行緒的許可尚不可用,則使其可用。如果執行緒在 park 上受阻塞,則它將解除其阻塞狀態。否則,保證下一次調用 park 不會受阻塞。如果給定執行緒尚未啟動,則無法保證此操作有任何效果。

參數:
thread - 要執行 unpark 操作的執行緒;該參數為 null 表示此操作沒有任何效果。

park

public static void park(Object blocker)
為了執行緒排程,在許可可用之前禁用當前執行緒。

如果許可可用,則使用該許可,並且該調用立即返回;否則,為執行緒排程禁用當前執行緒,並在發生以下三種情況之一前,使其處於休眠狀態:

此方法 報告是哪個執行緒導致該方法返回。調用者應該重新檢查最先導致執行緒暫停的條件。調用者還可以確定返回時該執行緒的中斷狀態。

參數:
blocker - 導致此執行緒暫停的同步物件
從以下版本開始:
1.6

parkNanos

public static void parkNanos(Object blocker,
                             long nanos)
為了執行緒排程,在許可可用前禁用當前執行緒,並最多等待指定的等待時間。

如果許可可用,則使用該許可,並且該調用立即返回;否則,為執行緒排程禁用當前執行緒,並在發生以下四種情況之一前,使其處於休眠狀態:

此方法 報告是哪個執行緒導致該方法返回。調用者應該重新檢查最先導致執行緒暫停的條件。調用者還可以確定返回時該執行緒的中斷狀態或已過的時間。

參數:
blocker - 導致此執行緒暫停的同步物件
nanos - 要等待的最大毫秒數
從以下版本開始:
1.6

parkUntil

public static void parkUntil(Object blocker,
                             long deadline)
為了執行緒排程,在指定的時限前禁用當前執行緒,除非許可可用。

如果許可可用,則使用該許可,並且該調用立即返回;否則,為執行緒排程禁用當前執行緒,並在發生以下四種情況之一前,使其處於休眠狀態:

此方法 報告是哪個執行緒導致該方法返回。調用者應該重新檢查最先導致執行緒暫停的條件。調用者還可以確定返回時該執行緒的中斷狀態或當前時間。

參數:
blocker - 導致此執行緒暫停的同步物件
deadline - 要等待的絕對時間,用相對於歷元 (Epoch) 的毫秒數值表示
從以下版本開始:
1.6

getBlocker

public static Object getBlocker(Thread t)
返回提供給最近一次尚未解除阻塞的 park 方法調用的 blocker 物件,如果該調用不受阻塞,則返回 null。返回的值只是一個瞬間快照,即由於未解除阻塞或者在不同的 blocker 物件上受阻而具有的執行緒。

返回:
blocker
從以下版本開始:
1.6

park

public static void park()
為了執行緒排程,禁用當前執行緒,除非許可可用。

如果許可可用,則使用該許可,並且該調用立即返回;否則,為執行緒排程禁用當前執行緒,並在發生以下三種情況之一以前,使其處於休眠狀態:

此方法並 報告是哪個執行緒導致該方法返回。調用者應該重新檢查最先導致執行緒暫停的條件。調用者還可以確定執行緒返回時的中斷狀態。


parkNanos

public static void parkNanos(long nanos)
為了執行緒排程禁用當前執行緒,最多等待指定的等待時間,除非許可可用。

如果許可可用,則使用該許可,並且該調用立即返回;否則,為執行緒排程禁用當前執行緒,並在發生以下四種情況之一以前,將其處於休眠狀態:

此方法並 報告是哪個執行緒導致該方法返回。調用者應該重新檢查最先導致執行緒暫停的條件。調用者還可以確定執行緒返回時的中斷狀態或所用的時間。

參數:
nanos - 要等待的最大毫秒數

parkUntil

public static void parkUntil(long deadline)
為了執行緒排程,在指定的時限前禁用當前執行緒,除非許可可用。

如果許可可用,則使用該許可,並且調用立即返回;否則,為執行緒排程禁用當前執行緒,並在發生以下四種情況之一以前,將其處於休眠狀態:

此方法並 報告是哪個執行緒導致該方法返回。調用者應該重新檢查最先導致執行緒暫停的條件。調用者還可以確定執行緒返回時的中斷狀態或當前時間。

參數:
deadline - 要等待的絕對時間,用相對於歷元的毫秒數值表示

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only