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>可能會<>被阻擋。 如果許可證尚未可用,請打電話 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 文件 java.util.concurrent.locks.LockSupport。
本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。
建構函式
| 名稱 | Description |
|---|---|
| LockSupport(IntPtr, JniHandleOwnership) |
用於建立 JNI 物件受管理表示的建構器;由執行時呼叫。 |
屬性
| 名稱 | Description |
|---|---|
| Class |
傳回這個 |
| Handle |
底層 Android 實例的帳號。 (繼承來源 Object) |
| JniIdentityHashCode |
取得由互通執行時指派給此 Java 對等端的身份雜湊碼。 (繼承來源 Object) |
| JniManagedPeerState |
基本的執行緒阻擋原語,用於建立鎖及其他同步類別。 (繼承來源 JavaObject) |
| JniPeerMembers |
取得用於調用此 Java 節點成員的 JNI 元資料。 |
| PeerReference |
取得這個 Java 節點的 JNI 物件參考。 (繼承來源 Object) |
| ThresholdClass |
此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。 |
| ThresholdType |
此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。 |
方法
| 名稱 | Description |
|---|---|
| Clone() |
建立並回傳此物件的副本。 (繼承來源 Object) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
基本的執行緒阻擋原語,用於建立鎖及其他同步類別。 (繼承來源 JavaObject) |
| Dispose() |
釋放該 Java 節點所持有的資源。 (繼承來源 Object) |
| Dispose(Boolean) |
釋放該 Java 節點所持有的資源。 (繼承來源 Object) |
| DisposeUnlessReferenced() |
基本的執行緒阻擋原語,用於建立鎖及其他同步類別。 (繼承來源 JavaObject) |
| Equals(Object) |
基本的執行緒阻擋原語,用於建立鎖及其他同步類別。 (繼承來源 JavaObject) |
| 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) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
基本的執行緒阻擋原語,用於建立鎖及其他同步類別。 (繼承來源 JavaObject) |
| ToArray<T>() |
從這個 Java 陣列包裝器建立一個受管理陣列。 (繼承來源 Object) |
| ToString() |
傳回物件的字串表示。 (繼承來源 Object) |
| Unpark(Thread) |
如果該討論串還沒有取得許可,會提供該討論串的許可。 |
| UnregisterFromRuntime() |
將此 Java 節點從互通執行時中取消註冊。 (繼承來源 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) |
明確介面實作
| 名稱 | Description |
|---|---|
| IJavaPeerable.Disposed() |
基本的執行緒阻擋原語,用於建立鎖及其他同步類別。 (繼承來源 JavaObject) |
| IJavaPeerable.Finalized() |
基本的執行緒阻擋原語,用於建立鎖及其他同步類別。 (繼承來源 JavaObject) |
| IJavaPeerable.JniObjectReferenceControlBlock |
基本的執行緒阻擋原語,用於建立鎖及其他同步類別。 (繼承來源 JavaObject) |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
基本的執行緒阻擋原語,用於建立鎖及其他同步類別。 (繼承來源 JavaObject) |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
基本的執行緒阻擋原語,用於建立鎖及其他同步類別。 (繼承來源 JavaObject) |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
基本的執行緒阻擋原語,用於建立鎖及其他同步類別。 (繼承來源 JavaObject) |
擴充方法
| 名稱 | Description |
|---|---|
| GetJniTypeName(IJavaPeerable) |
取得實例 |
| JavaAs<TResult>(IJavaPeerable) |
試著強制 |
| JavaCast<TResult>(IJavaObject) |
執行 Android 執行時檢查型別轉換。 |
| JavaCast<TResult>(IJavaObject) |
基本的執行緒阻擋原語,用於建立鎖及其他同步類別。 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
試著強制 |