言語

Semaphore クラス

定義

カウント セマフォ。

[Android.Runtime.Register("java/util/concurrent/Semaphore", DoNotGenerateAcw=true)]
public class Semaphore : Java.Lang.Object, IDisposable, 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が呼び出されると、項目がプールに返されるのを妨げるような同期ロックは保持されません。 セマフォは、プール自体の整合性を維持するために必要な同期とは別に、プールへのアクセスを制限するために必要な同期をカプセル化します。

セマフォが 1 つに初期化され、使用可能な許可が最大 1 つだけになるように使用されるセマフォは、相互除外ロックとして機能できます。 これは、 <em>binary セマフォ</em>としてより一般的に知られています。これは、2 つの状態 (1 つの許可が使用可能か、0 個の許可が使用可能) しかないためです。 この方法で使用すると、バイナリセマフォには、(多くの java.util.concurrent.locks.Lock 実装とは異なり)、その>プロパティがあります。lock>は、所有者以外のスレッドによって解放できます (セマフォには所有権の概念がないため)。 これは、デッドロックの復旧など、一部の特殊なコンテキストで役立ちます。

このクラスのコンストラクターは、必要に応じて、 <em>fairness</em> パラメーターを受け取ります。 false を設定した場合、このクラスは、スレッドが許可を取得する順序について保証しません。 特に、 <em>barging</em> は許可されます。つまり、 #acquire を呼び出すスレッドは、待機しているスレッドの前に許可を割り当てることができ、論理的には、新しいスレッドは待機中のスレッドのキューの先頭に自分自身を配置します。 公平性が true に設定されている場合、セマフォは、 #acquire() acquire メソッドのいずれかを呼び出すスレッドが、それらのメソッドの呼び出しが処理された順序 (先入れ先出し;FIFO)。 FIFO の順序付けは、これらのメソッド内の特定の内部実行ポイントに必ずしも適用されることに注意してください。 したがって、あるスレッドが別のスレッドの前に acquire を呼び出すことができますが、もう一方のスレッドの後の順序付けポイントに到達し、同様にメソッドから戻ると呼び出すことができます。 また、untimed #tryAcquire() tryAcquire メソッドは公平性の設定を尊重せず、使用可能な許可を受け取ります。

一般に、リソースアクセスを制御するために使用されるセマフォは、リソースへのアクセスからスレッドが枯渇しないように、公平として初期化する必要があります。 他の種類の同期制御にセマフォを使用する場合、公平でない順序付けのスループットの利点は、公平性の考慮事項を上回ることがよくあります。

このクラスには、一度に複数の許可を #acquire(int) acquire して #release(int) release するための便利なメソッドも用意されています。 これらのメソッドは、一般にループよりも効率的で効果的です。 ただし、ユーザー設定の順序は確立されません。 たとえば、スレッド A が s.acquire(3) を呼び出し、スレッド B が s.acquire(2)を呼び出し、2 つの許可が使用可能になった場合、その取得が先に行われ、セマフォ s がフェア モードでない限り、スレッド B がそれらを取得する保証はありません。

メモリ整合性の効果: release()<i>happen-before</i> などの "release" メソッドを呼び出す前のスレッド内のアクション。別のスレッドでの acquire() などの成功した "取得" メソッドに続くアクション。

1\.5 で追加されました。

Javaドキュメント。

このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。

コンストラクター

名前 説明
Semaphore(Int32, Boolean)

許可の数と指定された公平性の設定を使用して、 Semaphore を作成します。

Semaphore(Int32)

許可の数と非公平性の設定を使用して、 Semaphore を作成します。

Semaphore(IntPtr, JniHandleOwnership)

JNI オブジェクトのマネージド表現を作成するときに使用されるコンストラクター。ランタイムによって呼び出されます。

プロパティ

名前 説明
Class

この Objectのランタイム クラスを返します。

(継承元 Object)
Handle

基になる Android インスタンスへのハンドル。

(継承元 Object)
HasQueuedThreads

取得を待機しているスレッドがあるかどうかをクエリします。

IsFair

このセマフォに公平性が true に設定されている場合は、 true を返します。

JniIdentityHashCode

相互運用ランタイムによってこのJava ピアに割り当てられた ID ハッシュ コードを取得します。

(継承元 Object)
JniManagedPeerState

カウント セマフォ。

(継承元 JavaObject)
JniPeerMembers

カウント セマフォ。

PeerReference

このJava ピアの JNI オブジェクト参照を取得します。

(継承元 Object)
QueuedThreads

取得を待機している可能性があるスレッドを含むコレクションを返します。

QueueLength

取得を待機しているスレッドの数の推定値を返します。

ThresholdClass

この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。

ThresholdType

この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。

メソッド

名前 説明
Acquire()

このセマフォから許可を取得し、使用可能になるまでブロックするか、スレッドが Thread#interrupt interrupted になるまでブロックします。

Acquire(Int32)

このセマフォから指定された数の許可を取得し、すべてが使用可能になるまでブロックするか、スレッドが Thread#interrupt interrupted になるまでブロックします。

AcquireUninterruptibly()

このセマフォから許可を取得し、使用可能になるまでブロックします。

AcquireUninterruptibly(Int32)

このセマフォから許可の数を取得し、すべてが使用可能になるまでブロックします。

AvailablePermits()

このセマフォで使用可能な現在の許可の数を返します。

Clone()

このオブジェクトのコピーを作成して返します。

(継承元 Object)
Construct(JniObjectReference, JniObjectReferenceOptions)

カウント セマフォ。

(継承元 JavaObject)
Dispose()

このJava ピアによって保持されているリソースを解放します。

(継承元 Object)
Dispose(Boolean)

このJava ピアによって保持されているリソースを解放します。

(継承元 Object)
DisposeUnlessReferenced()

カウント セマフォ。

(継承元 JavaObject)
DrainPermits()

直ちに利用可能なすべての許可を取得して返すか、負の許可が利用可能な場合は、それらを解放します。

Equals(Object)

カウント セマフォ。

(継承元 JavaObject)
Equals(Object)

他のオブジェクトがこのオブジェクトと "等しい" かどうかを示します。

(継承元 Object)
GetHashCode()

オブジェクトのハッシュ コード値を返します。

(継承元 Object)
JavaFinalize()

オブジェクトへの参照がなくなったとガベージ コレクションによって判断されたときに、オブジェクトのガベージ コレクターによって呼び出されます。

(継承元 Object)
Notify()

このオブジェクトのモニターで待機している 1 つのスレッドを起動します。

(継承元 Object)
NotifyAll()

このオブジェクトのモニターで待機しているすべてのスレッドを起動します。

(継承元 Object)
ReducePermits(Int32)

指定された削減によって、使用可能な許可の数を縮小します。

Release()

許可を解放し、セマフォに返します。

Release(Int32)

許可の数を解放し、セマフォに返します。

SetHandle(IntPtr, JniHandleOwnership)

Handle プロパティを設定します。

(継承元 Object)
SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

カウント セマフォ。

(継承元 JavaObject)
ToArray<T>()

このJava配列ラッパーからマネージド配列を作成します。

(継承元 Object)
ToString()

オブジェクトの文字列表現を返します。

(継承元 Object)
TryAcquire()

呼び出し時に使用可能な場合にのみ、このセマフォから許可を取得します。

TryAcquire(Int32, Int64, TimeUnit)

指定された待機時間内にすべてが使用可能になり、現在のスレッドが Thread#interrupt 割り込みが中断されていない場合に、このセマフォから許可の数を取得します。

TryAcquire(Int32)

呼び出し時にすべてが使用可能な場合にのみ、このセマフォから許可の数を取得します。

TryAcquire(Int64, TimeUnit)

指定された待機時間内に使用可能になり、現在のスレッドが Thread#interrupted になっていない場合は、このセマフォから許可を取得します。

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)

明示的なインターフェイスの実装

名前 説明
IJavaPeerable.Disposed()

カウント セマフォ。

(継承元 JavaObject)
IJavaPeerable.Finalized()

カウント セマフォ。

(継承元 JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

カウント セマフォ。

(継承元 JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

カウント セマフォ。

(継承元 JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

カウント セマフォ。

(継承元 JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

カウント セマフォ。

(継承元 JavaObject)
IJavaPeerable.UnregisterFromRuntime()

カウント セマフォ。

拡張メソッド

名前 説明
GetJniTypeName(IJavaPeerable)

インスタンス selfの型の JNI 名を取得します。

JavaAs<TResult>(IJavaPeerable)

selfを強制的にTResult入力し、強制型がJava側で有効であることを確認します。

JavaCast<TResult>(IJavaObject)

Android ランタイムチェック型変換を実行します。

JavaCast<TResult>(IJavaObject)

カウント セマフォ。

TryJavaCast<TResult>(IJavaPeerable, TResult)

selfを強制的にTResult入力し、強制型がJava側で有効であることを確認します。

適用対象