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
之前,線程不會有任何動作將要求發佈至 unpark,則需要鎖定或封鎖。 因為只有一個允許與每個線程相關聯,所以任何中繼用途 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 檔。
此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。
建構函式
LockSupport(IntPtr, JniHandleOwnership) |
建立 JNI 物件的 Managed 表示法時使用的建構函式;由運行時間呼叫。 |
屬性
Class |
傳回這個 |
Handle |
基礎Android實例的句柄。 (繼承來源 Object) |
JniIdentityHashCode |
用來建立鎖定和其他同步處理類別的基本線程封鎖基本專案。 (繼承來源 Object) |
JniPeerMembers |
用來建立鎖定和其他同步處理類別的基本線程封鎖基本專案。 |
PeerReference |
用來建立鎖定和其他同步處理類別的基本線程封鎖基本專案。 (繼承來源 Object) |
ThresholdClass |
此 API 支援適用於 Android 的 Mono 基礎結構,並不適合直接從您的程式代碼使用。 |
ThresholdType |
此 API 支援適用於 Android 的 Mono 基礎結構,並不適合直接從您的程式代碼使用。 |
方法
Clone() |
建立並傳回這個 對象的複本。 (繼承來源 Object) |
Dispose() |
用來建立鎖定和其他同步處理類別的基本線程封鎖基本專案。 (繼承來源 Object) |
Dispose(Boolean) |
用來建立鎖定和其他同步處理類別的基本線程封鎖基本專案。 (繼承來源 Object) |
Equals(Object) |
指出其他物件是否「等於」這個物件。 (繼承來源 Object) |
GetBlocker(Thread) |
傳回提供給最近尚未解除封鎖之 park 方法調用的封鎖程序物件,如果未封鎖,則傳回 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, Int32) |
讓目前的線程等到喚醒為止,通常是因為 <em>notified</em> 或 <em>interrupted</em>,或直到經過一定數量的實時為止。 (繼承來源 Object) |
Wait(Int64) |
讓目前的線程等到喚醒為止,通常是因為 <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) |
用來建立鎖定和其他同步處理類別的基本線程封鎖基本專案。 |