語言

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>可能會<>被阻擋。 如果許可證尚未可用,請打電話 unpark 讓它能取得。 (不過與臂板不同的是,許可證不會累積。最多只有一個。)可靠使用需要使用揮發性(或原子級)變數來控制何時停車或退車。 這些方法的呼叫順序會根據揮發性變數存取維持,但不一定針對非揮發性變數存取。

方法 parkunpark 提供了有效的阻擋與解除阻塞執行緒的方法,這些執行緒不會遇到導致被棄用 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

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

(繼承來源 Object)
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)

設定物件要透過呼叫 #getBlocker getBlocker 回傳,針對目前執行緒。

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)

取得實例 self類型的 JNI 名稱。

JavaAs<TResult>(IJavaPeerable)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

JavaCast<TResult>(IJavaObject)

執行 Android 執行時檢查型別轉換。

JavaCast<TResult>(IJavaObject)

基本的執行緒阻擋原語,用於建立鎖及其他同步類別。

TryJavaCast<TResult>(IJavaPeerable, TResult)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

適用於