LockSupport 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。
[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
- 繼承
- 屬性
備註
建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。
這個類別會與使用它的每個執行緒產生關聯,允許類別) (java.util.concurrent.Semaphore Semaphore
。 如果允許可用,則會立即傳回 的呼叫 park
,並在進程中取用,否則會 < 傳回 em > may < /em > 區塊。 如果尚未提供允許,則為 的呼叫 unpark
。 不過, (與旗號不同,允許不會累積。最多有一個.) 可靠的使用方式需要使用變動性 (或不可部分完成的) 變數來控制何時要停駐或取消停駐。 這些方法的呼叫順序會根據變動性變數存取來維護,但不一定是非變動性變數存取。
park
方法並提供 unpark
有效率的方式封鎖和解除封鎖執行緒,這些執行緒不會遇到導致已被取代的方法 Thread.suspend
,而且 Thread.resume
基於這類目的而無法使用:叫用一個執行緒與另一個執行緒 park
unpark
之間的競爭會因為允許而保留即時性。 此外, 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 |
傳回這個 |
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) |
設定物件,由目前線程的 |
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) |
建立鎖定和其他同步處理類別的基本執行緒封鎖基本類型。 |