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
、アイテムがプールに返されるのを妨げるような同期ロックは保持されません。 セマフォは、プール自体の一貫性を維持するために必要な同期とは別に、プールへのアクセスを制限するために必要な同期をカプセル化します。
セマフォが 1 つに初期化され、使用可能な許可が最大 1 つだけになるように使用されるセマフォは、相互排他ロックとして機能します。 これは、2 つの状態 (使用可能な <許可が 1 つ、使用可能な許可が 0 個) しかないため、より一般的に em>バイナリ セマフォ</em> と呼ばれます。 この方法で使用すると、バイナリ セマフォには、(多くの 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()
<>) で成功した "acquire" メソッドに続く i happen-before</i> アクションなど。acquire()
1\.5 で追加されました。
の java.util.concurrent.Semaphore
Java ドキュメント。
このページの一部は、によって作成および共有された作業に基づく変更であり、に記載されている条件に従って使用されます。
コンストラクター
Semaphore(Int32) |
指定された数の許可と非公平性設定を使用して を |
Semaphore(Int32, Boolean) |
|
Semaphore(IntPtr, JniHandleOwnership) |
JNI オブジェクトのマネージド表現を作成するときに使用されるコンストラクター。ランタイムによって呼び出されます。 |
プロパティ
Class |
この |
Handle |
基になる Android インスタンスへのハンドル。 (継承元 Object) |
HasQueuedThreads |
取得を待機しているスレッドがあるかどうかを照会します。 |
IsFair |
このセマフォに |
JniIdentityHashCode |
カウント セマフォ。 (継承元 Object) |
JniPeerMembers |
カウント セマフォ。 |
PeerReference |
カウント セマフォ。 (継承元 Object) |
QueuedThreads |
取得を待機している可能性があるスレッドを含むコレクションを返します。 |
QueueLength |
取得を待機しているスレッドの数の見積もりを返します。 |
ThresholdClass |
この API は Mono for Android インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。 |
ThresholdType |
この API は Mono for Android インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。 |
メソッド
Acquire() |
このセマフォから許可を取得し、使用可能になるまでブロックするか、スレッドが Thread#interrupt interrupted になるまでブロックします。 |
Acquire(Int32) |
このセマフォから指定された数の許可を取得し、すべてが使用可能になるまでブロックするか、スレッドが Thread#interrupt interrupted になるまでブロックします。 |
AcquireUninterruptibly() |
このセマフォから許可を取得し、使用可能になるまでブロックします。 |
AcquireUninterruptibly(Int32) |
このセマフォから指定された数の許可を取得し、すべてが使用可能になるまでブロックします。 |
AvailablePermits() |
このセマフォで使用可能な許可の現在の数を返します。 |
Clone() |
このオブジェクトのコピーを作成して返します。 (継承元 Object) |
Dispose() |
カウント セマフォ。 (継承元 Object) |
Dispose(Boolean) |
カウント セマフォ。 (継承元 Object) |
DrainPermits() |
直ちに利用可能なすべての許可を取得して返すか、否定的な許可が利用可能な場合は、それらを解放します。 |
Equals(Object) |
他のオブジェクトがこのオブジェクトと "等しい" かどうかを示します。 (継承元 Object) |
GetHashCode() |
オブジェクトのハッシュ コード値を返します。 (継承元 Object) |
JavaFinalize() |
オブジェクトへの参照がなくなったとガベージ コレクションが判断したときに、オブジェクトのガベージ コレクターによって呼び出されます。 (継承元 Object) |
Notify() |
このオブジェクトのモニターで待機している 1 つのスレッドを起動します。 (継承元 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> または>< em 中断</em によって待機します>。> (継承元 Object) |
Wait(Int64) |
現在のスレッドが起動するまで待機します。通常<は、通知></em> または <>em 中断</em>、または特定のリアルタイムが経過するまで待機します。 (継承元 Object) |
Wait(Int64, Int32) |
現在のスレッドが起動するまで待機します。通常<は、通知></em> または <>em 中断</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) |
カウント セマフォ。 |