Share via


Semaphore 類別

定義

計數號誌。

[Android.Runtime.Register("java/util/concurrent/Semaphore", DoNotGenerateAcw=true)]
public class Semaphore : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, Java.IO.ISerializable
[<Android.Runtime.Register("java/util/concurrent/Semaphore", DoNotGenerateAcw=true)>]
type Semaphore = class
    inherit Object
    interface ISerializable
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
繼承
Semaphore
屬性
實作

備註

計數號誌。 就概念上,號志會維護一組允許。 如有必要,每個 #acquire 區塊會等到允許可用為止,然後再接受它。 每個 #release 都會新增允許,可能會釋放封鎖的取得者。 不過,不會使用實際的允許物件;只會 Semaphore 保留可用數目的計數,並據以運作。

旗號通常用來限制線程數目,而不是可以存取某些實體或邏輯) 資源 (。 例如,以下是使用號誌來控制專案集區存取權的類別:

{@code
            class Pool {
              private static final int MAX_AVAILABLE = 100;
              private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);

              public Object getItem() throws InterruptedException {
                available.acquire();
                return getNextAvailableItem();
              }

              public void putItem(Object x) {
                if (markAsUnused(x))
                  available.release();
              }

              // Not a particularly efficient data structure; just for demo

              protected Object[] items = ...; // whatever kinds of items being managed
              protected boolean[] used = new boolean[MAX_AVAILABLE];

              protected synchronized Object getNextAvailableItem() {
                for (int i = 0; i < MAX_AVAILABLE; ++i) {
                  if (!used[i]) {
                    used[i] = true;
                    return items[i];
                  }
                }
                return null; // not reached
              }

              protected synchronized boolean markAsUnused(Object item) {
                for (int i = 0; i < MAX_AVAILABLE; ++i) {
                  if (item == items[i]) {
                    if (used[i]) {
                      used[i] = false;
                      return true;
                    } else
                      return false;
                  }
                }
                return false;
              }
            }}

取得專案之前,每個線程都必須從號誌取得允許,以確保專案可供使用。 當線程完成專案時,它會傳回集區,並將允許傳回至旗號,讓另一個線程取得該專案。 請注意,當 #acquire 呼叫 時不會保留同步處理鎖定,因為這樣會防止專案傳回集區。 信號會封裝限制集區存取所需的同步處理,與維護集區本身一致性所需的任何同步處理分開。

初始化為一個的號誌,而且用來讓它最多只能有一個可用的允許,可作為相互排除鎖定。 這通常稱為 em> 二進位號誌</em>,因為它只有兩種狀態:一個<允許可用,或零個允許可用。 以此方式使用時,二進位號誌具有 屬性 (,與 &商) 不同的是 java.util.concurrent.locks.Lock ;lock"可由擁有者 (以外的線程釋放,因為號誌沒有擁有權概念) 。 這在某些特製化內容中很有用,例如死結復原。

這個類別的建構函式選擇性地接受 <em>fairness</em> 參數。 當設定 false 時,這個類別不會保證線程取得允許的順序。 特別是 <,允許 em>barging</em> ,也就是說,可以在等候的線程 #acquire 前面配置允許,邏輯上,新線程會將自己放在等候線程佇列的前端。 當公平性設定為 true 時,旗號會保證會選取叫用任何方法的 #acquire() acquire 線程,以取得這些方法的叫用順序 (先出;FIFO) 。 請注意,FIFO 排序一定適用於這些方法內的特定內部執行點。 因此,一個線程可以在另一個線程之前叫用 acquire ,但到達另一個線程之後的排序點,同樣地從 方法傳回時也一樣。 另請注意,未定時 #tryAcquire() tryAcquire 的方法不接受公平性設定,但會採用任何可用的允許。

一般而言,用來控制資源存取的號誌應該初始化為公平,以確保沒有任何線程無法存取資源。 針對其他類型的同步控制使用號誌時,非公平排序的輸送量優點通常超過公平性考慮。

這個類別也提供一次和#release(int) release多個允許的便利方法#acquire(int) acquire。 這些方法通常比迴圈更有效率且有效。 不過,它們不會建立任何喜好設定順序。 例如,如果線程 A 叫 s.acquire(3 用) 且線程 B 叫 s.acquire(2)用 ,而兩個允許變成可用,則除非線程 B 會先取得,否則線程 B 會取得它們,而且 Semaphore s 處於公平模式。

記憶體一致性效果:在呼叫「發行」方法之前,線程中的動作,例如 release()<在>成功「取得」方法之後發生</i> 動作,例如 acquire() 在另一個線程中。

在 1.5 中新增。

java.util.concurrent.SemaphoreJava 檔。

此頁面的部分是根據 所建立和共用的工作進行修改,並根據 2.5 屬性授權中所述的詞彙來使用。

建構函式

Semaphore(Int32)

Semaphore使用指定的允許數目與非公平性設定來建立 。

Semaphore(Int32, Boolean)

Semaphore使用指定的允許數目與指定的公平性設定,建立 。

Semaphore(IntPtr, JniHandleOwnership)

建立 JNI 物件的 Managed 表示法時使用的建構函式;由運行時間呼叫。

屬性

Class

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

(繼承來源 Object)
Handle

基礎Android實例的句柄。

(繼承來源 Object)
HasQueuedThreads

查詢是否有任何線程正在等候取得。

IsFair

如果這個號誌的公平性設定為 true,則傳 true 回 。

JniIdentityHashCode

計數號誌。

(繼承來源 Object)
JniPeerMembers

計數號誌。

PeerReference

計數號誌。

(繼承來源 Object)
QueuedThreads

傳回集合,其中包含可能等候取得的線程。

QueueLength

傳回等候取得的線程數目估計值。

ThresholdClass

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

ThresholdType

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

方法

Acquire()

從這個號誌取得允許,封鎖直到有一個可用,或線程中斷線程中斷為止。

Acquire(Int32)

從這個號誌取得指定的允許數目、封鎖直到全部可用,或線程為 Thread#中斷中斷為止。

AcquireUninterruptibly()

從這個號誌取得允許,直到有一個可用為止。

AcquireUninterruptibly(Int32)

從這個號誌取得指定的允許數目,直到所有允許都可用為止。

AvailablePermits()

傳回這個號誌中可用的目前允許數目。

Clone()

建立並傳回這個 對象的複本。

(繼承來源 Object)
Dispose()

計數號誌。

(繼承來源 Object)
Dispose(Boolean)

計數號誌。

(繼承來源 Object)
DrainPermits()

取得並傳回立即可用的所有允許,或如果有負數允許,則會釋出它們。

Equals(Object)

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

(繼承來源 Object)
GetHashCode()

傳回此物件的雜湊碼值。

(繼承來源 Object)
JavaFinalize()

當垃圾收集判斷物件不再參考物件時,垃圾收集行程會在物件上呼叫。

(繼承來源 Object)
Notify()

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

(繼承來源 Object)
NotifyAll()

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

(繼承來源 Object)
ReducePermits(Int32)

藉由指定的縮減來壓縮可用允許的數目。

Release()

釋放允許,並將它傳回至號誌。

Release(Int32)

釋放指定的允許數目,並將其傳回至號誌。

SetHandle(IntPtr, JniHandleOwnership)

設定 Handle 屬性。

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

計數號誌。

(繼承來源 Object)
ToString()

傳回物件的字串表示。

(繼承來源 Object)
TryAcquire()

只有在叫用時有一個可用時,才會從這個號誌取得允許。

TryAcquire(Int32)

從這個旗號取得指定數目的允許,只有在叫用時所有允許都可用時。

TryAcquire(Int32, Int64, TimeUnit)

從這個號誌取得指定數目的允許,如果所有允許在指定的等候時間內可用,而且目前線程尚未中斷 Thread#interrupt。

TryAcquire(Int64, TimeUnit)

從這個號誌取得允許,如果一個在指定的等候時間內變成可用,而且目前線程尚未中斷 Thread#interrupt。

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)

計數號誌。

適用於