Share via


LockSupport 類別

定義

建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。

[Android.Runtime.Register("java/util/concurrent/locks/LockSupport", DoNotGenerateAcw=true)]
public class LockSupport : Java.Lang.Object
[<Android.Runtime.Register("java/util/concurrent/locks/LockSupport", DoNotGenerateAcw=true)>]
type LockSupport = class
    inherit Object
繼承
LockSupport
屬性

備註

建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。

這個類別會與使用它的每個執行緒產生關聯,允許類別) (java.util.concurrent.Semaphore Semaphore 。 如果允許可用,則會立即傳回 的呼叫 park ,並在進程中取用,否則會 < 傳回 em > may < /em > 區塊。 如果尚未提供允許,則為 的呼叫 unpark 。 不過, (與旗號不同,允許不會累積。最多有一個.) 可靠的使用方式需要使用變動性 (或不可部分完成的) 變數來控制何時要停駐或取消停駐。 這些方法的呼叫順序會根據變動性變數存取來維護,但不一定是非變動性變數存取。

park方法並提供 unpark 有效率的方式封鎖和解除封鎖執行緒,這些執行緒不會遇到導致已被取代的方法 Thread.suspend ,而且 Thread.resume 基於這類目的而無法使用:叫用一個執行緒與另一個執行緒 parkunpark 之間的競爭會因為允許而保留即時性。 此外, park 如果呼叫端的執行緒中斷,且支援逾時版本,將會傳回 。 方法 park 也可能因為「無理由」而在其他時間傳回,因此一般而言,必須在傳回時重新檢查條件的迴圈內叫用。 在此情況下 park ,可做為「忙碌等候」的優化,不會浪費太多時間旋轉,但必須與 配對 unpark 才能有效。

這三種形式的 park 各也支援 blocker 物件參數。 當執行緒遭到封鎖以允許監視和診斷工具識別執行緒遭到封鎖的原因時,就會記錄此物件。 (這類工具可能會使用方法 #getBlocker(Thread) .) 使用這些表單,而不是不使用此參數的原始表單,強烈建議使用封鎖程式。 在鎖定實作中提供 作為 blocker 的一般引數為 this

這些方法的設計目的是要做為建立較高層級同步處理公用程式的工具,而且對於大部分並行控制應用程式而言並不實用。 方法 park 的設計只用于表單的建構:

{@code
            while (!canProceed()) {
              // ensure request to unpark is visible to other threads
              ...
              LockSupport.park(this);
            }}

其中線程在呼叫 park 之前,不會有任何動作發佈要求取消鎖定或封鎖。 由於只有一個允許與每個執行緒相關聯,因此任何媒介的用法,包括透過類別載入隱含使用 park ,可能會導致沒有回應的執行緒 (「遺失未更新」) 。

<b > 範例使用方式。 </b > 以下是優先輸出非重新進入鎖定類別的草圖:

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

              public void lock() {
                boolean wasInterrupted = false;
                // publish current thread for unparkers
                waiters.add(Thread.currentThread());

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

                waiters.remove();
                // ensure correct interrupt status on return
                if (wasInterrupted)
                  Thread.currentThread().interrupt();
              }

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

              static {
                // Reduce the risk of "lost unpark" due to classloading
                Class<?> ensureLoaded = LockSupport.class;
              }
            }}

在 1.5 中新增。

java.util.concurrent.locks.LockSupport JAVA 檔。

此頁面的部分是根據 原始碼專案所建立和共用的工作進行修改,並根據中所述的詞彙使用。

建構函式

LockSupport(IntPtr, JniHandleOwnership)

建立 JNI 物件的 Managed 標記法時所使用的建構函式;由執行時間呼叫。

屬性

Class

傳回這個 Object 的執行時間類別。

(繼承來源 Object)
Handle

基礎 Android 實例的控制碼。

(繼承來源 Object)
JniIdentityHashCode

建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。

(繼承來源 Object)
JniPeerMembers

建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。

PeerReference

建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。

(繼承來源 Object)
ThresholdClass

此 API 支援 Mono for Android 基礎結構,並不適合直接從您的程式碼使用。

ThresholdType

此 API 支援 Mono for Android 基礎結構,並不適合直接從您的程式碼使用。

方法

Clone()

建立並傳回這個 物件的複本。

(繼承來源 Object)
Dispose()

建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。

(繼承來源 Object)
Dispose(Boolean)

建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。

(繼承來源 Object)
Equals(Object)

指出其他物件是否「等於」這個物件。

(繼承來源 Object)
GetBlocker(Thread)

傳回提供給尚未解除封鎖之駐留方法的最新調用的封鎖程式物件,如果未封鎖,則傳回 null。

GetHashCode()

傳回此物件的雜湊碼值。

(繼承來源 Object)
JavaFinalize()

當垃圾收集判斷物件沒有其他參考時,由物件上的垃圾收集行程呼叫。

(繼承來源 Object)
Notify()

喚醒正在等候此物件的監視器的單一線程。

(繼承來源 Object)
NotifyAll()

喚醒正在等候此物件監視器的所有線程。

(繼承來源 Object)
Park()

除非允許可用,否則會停用執行緒排程目的目前的執行緒。

Park(Object)

除非允許可用,否則會停用執行緒排程目的目前的執行緒。

ParkNanos(Int64)

針對執行緒排程目的停用目前線程,直到指定的等候時間為止,除非允許。

ParkNanos(Object, Int64)

針對執行緒排程目的停用目前線程,直到指定的等候時間為止,除非允許。

ParkUntil(Int64)

除非允許可用,否則會停用執行緒排程目的的目前線程,直到指定的期限為止。

ParkUntil(Object, Int64)

除非允許可用,否則會停用執行緒排程目的的目前線程,直到指定的期限為止。

SetCurrentBlocker(Object)

設定物件,由目前線程的 #getBlocker getBlocker 調用傳回。

SetHandle(IntPtr, JniHandleOwnership)

設定 Handle 屬性。

(繼承來源 Object)
ToArray<T>()

建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。

(繼承來源 Object)
ToString()

傳回物件的字串表示。

(繼承來源 Object)
Unpark(Thread)

如果指定的執行緒尚未可用,請提供允許。

UnregisterFromRuntime()

建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。

(繼承來源 Object)
Wait()

讓目前的執行緒等到喚醒為止,通常是藉由 < em > notified < /em > 或 < em > interrupted < /em > 來喚醒。

(繼承來源 Object)
Wait(Int64)

讓目前的執行緒等到喚醒為止,通常是 < 透過 em > notified < /em 或 em > interrupted < /em >> ,或 < 直到經過一定數量的即時為止。

(繼承來源 Object)
Wait(Int64, Int32)

讓目前的執行緒等到喚醒為止,通常是 < 透過 em > notified < /em 或 em > interrupted < /em >> ,或 < 直到經過一定數量的即時為止。

(繼承來源 Object)

明確介面實作

IJavaPeerable.Disposed()

建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。

(繼承來源 Object)
IJavaPeerable.DisposeUnlessReferenced()

建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。

(繼承來源 Object)
IJavaPeerable.Finalized()

建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。

(繼承來源 Object)
IJavaPeerable.JniManagedPeerState

建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。

(繼承來源 Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。

(繼承來源 Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。

(繼承來源 Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。

(繼承來源 Object)

擴充方法

JavaCast<TResult>(IJavaObject)

執行 Android 執行時間檢查的類型轉換。

JavaCast<TResult>(IJavaObject)

建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。

GetJniTypeName(IJavaPeerable)

建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。

適用於