Semaphore 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
計數號誌。
[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
- 繼承
- 屬性
- 實作
備註
計數號誌。 就概念上,號志會維護一組允許。 如有必要,每個 #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.Semaphore
Java 檔。
此頁面的部分是根據 所建立和共用的工作進行修改,並根據 2.5 屬性授權中所述的詞彙來使用。
建構函式
Semaphore(Int32) |
|
Semaphore(Int32, Boolean) |
|
Semaphore(IntPtr, JniHandleOwnership) |
建立 JNI 物件的 Managed 表示法時使用的建構函式;由運行時間呼叫。 |
屬性
Class |
傳回這個 |
Handle |
基礎Android實例的句柄。 (繼承來源 Object) |
HasQueuedThreads |
查詢是否有任何線程正在等候取得。 |
IsFair |
如果這個號誌的公平性設定為 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) |
計數號誌。 |