AbstractQueuedSynchronizer クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
先入れ先出し (FIFO) 待機キューに依存するブロック ロックと関連するシンクロナイザー (セマフォ、イベントなど) を実装するためのフレームワークを提供します。
[Android.Runtime.Register("java/util/concurrent/locks/AbstractQueuedSynchronizer", DoNotGenerateAcw=true)]
public abstract class AbstractQueuedSynchronizer : Java.Util.Concurrent.Locks.AbstractOwnableSynchronizer, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("java/util/concurrent/locks/AbstractQueuedSynchronizer", DoNotGenerateAcw=true)>]
type AbstractQueuedSynchronizer = class
inherit AbstractOwnableSynchronizer
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- 継承
- 属性
- 実装
注釈
先入れ先出し (FIFO) 待機キューに依存するブロック ロックと関連するシンクロナイザー (セマフォ、イベントなど) を実装するためのフレームワークを提供します。 このクラスは、状態を表すために 1 つのアトミック int
値に依存するほとんどの種類のシンクロナイザーに役立つ基礎として設計されています。 サブクラスは、この状態を変更する保護されたメソッドを定義し、その状態が取得または解放されるオブジェクトの観点から何を意味するかを定義する必要があります。 これらを考えると、このクラスの他のメソッドは、すべてのキューとブロックのメカニズムを実行します。 サブクラスは他の状態フィールドを維持できますが、アトミックに更新int
された値のみが メソッド #getState
#setState
を使用して操作され、#compareAndSetState
同期に関して追跡されます。
サブクラスは、その外側のクラスの同期プロパティを実装するために使用される非パブリック内部ヘルパー クラスとして定義する必要があります。 クラス AbstractQueuedSynchronizer
は同期インターフェイスを実装しません。 代わりに、具体的なロックと関連するシンクロナイザーによって必要に応じて呼び出してパブリック メソッドを実装できる などの #acquireInterruptibly
メソッドを定義します。
このクラスは、既定<の em>排他</em モードと em>shared</em>> モードの両方または両方を<サポートします。 排他モードで取得した場合、他のスレッドによる取得の試行は成功できません。 共有モードは、複数のスレッドによって取得される場合があります (ただし、必要ありません)。 このクラスは quot を &しません。&クォートを理解する。これらの違いは、共有モードの取得が成功すると、次の待機スレッド (存在する場合) も取得できるかどうかを判断する必要があるという機械的な意味を除きます。 異なるモードで待機しているスレッドは、同じ FIFO キューを共有します。 通常、実装サブクラスは、これらのモードの 1 つのみをサポートしますが、どちらも たとえば、 で ReadWriteLock
使用できます。 排他モードまたは共有モードのみをサポートするサブクラスでは、未使用モードをサポートするメソッドを定義する必要はありません。
このクラスは、排他モードをサポートするサブクラスによって実装としてCondition
使用できる入れ子になったConditionObject
クラスを定義します。このメソッド#isHeldExclusively
は、同期が現在のスレッドに対して排他的に保持されているかどうかを報告します。現在#getState
の値で呼び出されたメソッド#release
は、このオブジェクトを完全に解放し#acquire
、この保存された状態値を指定すると、最終的にこのオブジェクトを以前に取得した状態に復元します。 AbstractQueuedSynchronizer
それ以外の場合、このような条件を作成するメソッドはないため、この制約を満たすことができない場合は使用しないでください。 の ConditionObject
動作は、シンクロナイザー実装のセマンティクスに依存します。
このクラスは、内部キューの検査、インストルメンテーション、および監視メソッドと、条件オブジェクトの同様のメソッドを提供します。 これらは、同期メカニズムのために を AbstractQueuedSynchronizer
使用して、必要に応じてクラスにエクスポートできます。
このクラスのシリアル化では、基になるアトミック整数の保持状態のみが格納されるため、逆シリアル化されたオブジェクトには空のスレッド キューがあります。 シリアル化可能性を必要とする一般的なサブクラスでは、逆シリアル化時にこれを既知の初期状態に復元するメソッドが定義 readObject
されます。
<h2>Usage</h2>
シンクロナイザーの基礎としてこのクラスを使用するには、必要に応じて、 を使用して#getState
#setState
同期状態を検査または変更することで、次のメソッドを#compareAndSetState
再定義します。
<ul>li li<#tryAcquire
>li>#tryRelease
<li#tryAcquireShared
<>li>#isHeldExclusively
<><#tryReleaseShared
/ul<>
これらの各メソッドは、既定で をスローします UnsupportedOperationException
。 これらのメソッドの実装は、内部的にスレッド セーフである必要があり、一般に短く、ブロックしないようにする必要があります。 これらのメソッドを定義することは、このクラスを <使用するための em>only</em> でサポートされる手段です。 他のすべてのメソッドは、個別に変更できないために宣言されます final
。
継承された メソッドは AbstractOwnableSynchronizer
、排他シンクロナイザーを所有するスレッドを追跡するのに役立つ場合もあります。 これを使用することをお勧めします。これにより、監視ツールと診断ツールを使用して、ユーザーがロックを保持しているスレッドを判断するのに役立てることができます。
このクラスは内部 FIFO キューに基づいていますが、FIFO 取得ポリシーは自動的に適用されません。 排他同期のコアは、次の形式になります。
<em>Acquire:</em>
while (!tryAcquire(arg)) {
<em>enqueue thread if it is not already queued</em>;
<em>possibly block current thread</em>;
}
<em>Release:</em>
if (tryRelease(arg))
<em>unblock the first queued thread</em>;
(共有モードは似ていますが、カスケード信号が含まれる場合があります)。
<p id="barging">: エンキューの前に acquire のチェックインが呼び出されるため、新しく取得するスレッドは、ブロックされキューに登録されている他のスレッドよりも前に割り込<み/em> を行う可能性があります<>。 ただし、必要に応じて、1 つ以上の検査方法を内部的に呼び出してバージを定義tryAcquire
またはtryAcquireShared
無効化し、fair</em> FIFO 取得順序を<>提供することができます。 特に、ほとんどのフェア シンクロナイザーは、 (フェア シンクロナイザーによって使用されるように特別に設計されたメソッド) が を返false
す場合#hasQueuedPredecessors
に を返true
すように定義tryAcquire
できます。 その他のバリエーションも可能です。
スループットとスケーラビリティは、一般に、既定のバージング (em greedy</em、em>renouncement</em>>、<em>< convoy-avoidance</em> とも呼ばれます<) 戦略で最も高くなります。> これは公平または枯渇が発生しないことは保証されませんが、以前のキューに登録されたスレッドは、後でキューに登録されたスレッドの前に再コンテンドすることができ、各再調整では、受信スレッドに対して成功する機会が偏りません。 また、取得は量子を &しません。スピン&量子。通常の意味では、ブロックする前に、他の計算に散在するの複数の tryAcquire
呼び出しを実行できます。 これにより、排他的同期が一時的にしか保持されない場合、スピンの利点の大部分が得られます。そうでない場合は、ほとんどの負債はありません。 必要に応じて、前述の呼び出しで"高速パス" チェックを使用してメソッドを取得し、おそらく事前チェック #hasContended
を #hasQueuedThreads
行い、シンクロナイザーが意図されていない可能性がある場合にのみこれを行うことで、これを拡張できます。
このクラスは、状態、取得、および解放パラメーター、および内部 FIFO 待機キューに int
依存できるシンクロナイザーに使用範囲を特殊化することで、同期の効率的でスケーラブルな基礎を提供します。 これで十分でない場合は、クラス、独自のカスタム java.util.Queue
クラス、ブロックLockSupport
サポートを使用してjava.util.concurrent.atomic atomic
、下位レベルからシンクロナイザーを構築できます。
<h2>使用例</h2>
値 0 を使用してロック解除された状態を表し、1 つを使用してロック状態を表す、再入可能でない相互排他ロック クラスを次に示します。 再入禁止ロックでは、現在の所有者スレッドの記録は厳密には必要ありませんが、このクラスは、使用状況の監視を容易にするためにそのようにします。 また、条件をサポートし、いくつかのインストルメンテーション メソッドを公開します。
{@code
class Mutex implements Lock, java.io.Serializable {
// Our internal helper class
private static class Sync extends AbstractQueuedSynchronizer {
// Acquires the lock if state is zero
public boolean tryAcquire(int acquires) {
assert acquires == 1; // Otherwise unused
if (compareAndSetState(0, 1)) {
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}
// Releases the lock by setting state to zero
protected boolean tryRelease(int releases) {
assert releases == 1; // Otherwise unused
if (!isHeldExclusively())
throw new IllegalMonitorStateException();
setExclusiveOwnerThread(null);
setState(0);
return true;
}
// Reports whether in locked state
public boolean isLocked() {
return getState() != 0;
}
public boolean isHeldExclusively() {
// a data race, but safe due to out-of-thin-air guarantees
return getExclusiveOwnerThread() == Thread.currentThread();
}
// Provides a Condition
public Condition newCondition() {
return new ConditionObject();
}
// Deserializes properly
private void readObject(ObjectInputStream s)
throws IOException, ClassNotFoundException {
s.defaultReadObject();
setState(0); // reset to unlocked state
}
}
// The sync object does all the hard work. We just forward to it.
private final Sync sync = new Sync();
public void lock() { sync.acquire(1); }
public boolean tryLock() { return sync.tryAcquire(1); }
public void unlock() { sync.release(1); }
public Condition newCondition() { return sync.newCondition(); }
public boolean isLocked() { return sync.isLocked(); }
public boolean isHeldByCurrentThread() {
return sync.isHeldExclusively();
}
public boolean hasQueuedThreads() {
return sync.hasQueuedThreads();
}
public void lockInterruptibly() throws InterruptedException {
sync.acquireInterruptibly(1);
}
public boolean tryLock(long timeout, TimeUnit unit)
throws InterruptedException {
return sync.tryAcquireNanos(1, unit.toNanos(timeout));
}
}}
次に示すのは、 のような java.util.concurrent.CountDownLatch CountDownLatch
ラッチ クラスです。ただし、起動に必要なのは 1 つだけ signal
です。 ラッチは非排他的であるため、取得メソッドと解放メソッドを shared
使用します。
{@code
class BooleanLatch {
private static class Sync extends AbstractQueuedSynchronizer {
boolean isSignalled() { return getState() != 0; }
protected int tryAcquireShared(int ignore) {
return isSignalled() ? 1 : -1;
}
protected boolean tryReleaseShared(int ignore) {
setState(1);
return true;
}
}
private final Sync sync = new Sync();
public boolean isSignalled() { return sync.isSignalled(); }
public void signal() { sync.releaseShared(1); }
public void await() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}
}}
1\.5 で追加されました。
の Java ドキュメント java.util.concurrent.locks.AbstractQueuedSynchronizer
。
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。
コンストラクター
AbstractQueuedSynchronizer() |
初期同期状態が 0 の新しい |
AbstractQueuedSynchronizer(IntPtr, JniHandleOwnership) |
JNI オブジェクトのマネージド表現を作成するときに使用されるコンストラクター。ランタイムによって呼び出されます。 |
プロパティ
Class |
この |
ExclusiveOwnerThread |
によって最後に設定された |
ExclusiveQueuedThreads |
排他モードでの取得を待機している可能性があるスレッドを含むコレクションを返します。 |
FirstQueuedThread |
キュー内の最初の (最も長く待機している) スレッドを返します。または |
Handle |
基になる Android インスタンスへのハンドル。 (継承元 Object) |
HasContended |
このシンクロナイザーの取得を意図したスレッドがあるかどうかをクエリします。つまり、acquire メソッドがブロックされた場合です。 |
HasQueuedPredecessors |
現在のスレッドよりも長い取得を待機しているスレッドがあるかどうかを照会します。 |
HasQueuedThreads |
取得を待機しているスレッドがあるかどうかを照会します。 |
IsHeldExclusively |
同期が現在の |
JniIdentityHashCode |
先入れ先出し (FIFO) 待機キューに依存するブロック ロックと関連するシンクロナイザー (セマフォ、イベントなど) を実装するためのフレームワークを提供します。 (継承元 Object) |
JniPeerMembers |
先入れ先出し (FIFO) 待機キューに依存するブロック ロックと関連するシンクロナイザー (セマフォ、イベントなど) を実装するためのフレームワークを提供します。 |
PeerReference |
先入れ先出し (FIFO) 待機キューに依存するブロック ロックと関連するシンクロナイザー (セマフォ、イベントなど) を実装するためのフレームワークを提供します。 (継承元 Object) |
QueuedThreads |
取得を待機している可能性があるスレッドを含むコレクションを返します。 |
QueueLength |
取得を待機しているスレッドの数の推定値を返します。 |
SharedQueuedThreads |
共有モードでの取得を待機している可能性があるスレッドを含むコレクションを返します。 |
State |
同期状態の現在の値を返します。 または、同期状態の値を設定します。 |
ThresholdClass |
この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用することを意図したものではありません。 |
ThresholdType |
この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用することを意図したものではありません。 |
メソッド
Acquire(Int32) |
割り込みを無視して排他モードで取得します。 |
AcquireInterruptibly(Int32) |
排他モードで取得し、中断された場合は中止します。 |
AcquireShared(Int32) |
割り込みを無視して共有モードで取得します。 |
AcquireSharedInterruptibly(Int32) |
共有モードで取得し、中断された場合は中止します。 |
Clone() |
このオブジェクトのコピーを作成して返します。 (継承元 Object) |
CompareAndSetState(Int32, Int32) |
現在の状態の値が期待値と等しい場合は、同期状態を特定の更新された値にアトミックに設定します。 |
Dispose() |
先入れ先出し (FIFO) 待機キューに依存するブロック ロックと関連するシンクロナイザー (セマフォ、イベントなど) を実装するためのフレームワークを提供します。 (継承元 Object) |
Dispose(Boolean) |
先入れ先出し (FIFO) 待機キューに依存するブロック ロックと関連するシンクロナイザー (セマフォ、イベントなど) を実装するためのフレームワークを提供します。 (継承元 Object) |
Equals(Object) |
他のオブジェクトがこのオブジェクトと "等しい" かどうかを示します。 (継承元 Object) |
GetHashCode() |
オブジェクトのハッシュ コード値を返します。 (継承元 Object) |
GetWaitingThreads(AbstractQueuedSynchronizer+ConditionObject) |
このシンクロナイザーに関連付けられている特定の条件で待機している可能性があるスレッドを含むコレクションを返します。 |
GetWaitQueueLength(AbstractQueuedSynchronizer+ConditionObject) |
このシンクロナイザーに関連付けられている特定の条件で待機しているスレッドの数の推定値を返します。 |
HasWaiters(AbstractQueuedSynchronizer+ConditionObject) |
このシンクロナイザーに関連付けられている特定の条件で、スレッドが待機しているかどうかを照会します。 |
IsQueued(Thread) |
指定されたスレッドが現在キューに入っている場合は true を返します。 |
JavaFinalize() |
ガベージ コレクションがオブジェクトへの参照がなくなったと判断したときに、オブジェクトのガベージ コレクターによって呼び出されます。 (継承元 Object) |
Notify() |
このオブジェクトのモニターで待機している 1 つのスレッドをウェイクアップします。 (継承元 Object) |
NotifyAll() |
このオブジェクトのモニターで待機しているすべてのスレッドをウェイクアップします。 (継承元 Object) |
Owns(AbstractQueuedSynchronizer+ConditionObject) |
指定された ConditionObject がこのシンクロナイザーをロックとして使用するかどうかを照会します。 |
Release(Int32) |
排他モードのリリース。 |
ReleaseShared(Int32) |
共有モードのリリース。 |
SetHandle(IntPtr, JniHandleOwnership) |
Handle プロパティを設定します。 (継承元 Object) |
ToArray<T>() |
先入れ先出し (FIFO) 待機キューに依存するブロック ロックと関連するシンクロナイザー (セマフォ、イベントなど) を実装するためのフレームワークを提供します。 (継承元 Object) |
ToString() |
オブジェクトの文字列形式を返します。 (継承元 Object) |
TryAcquire(Int32) |
排他モードで取得を試みます。 |
TryAcquireNanos(Int32, Int64) |
排他モードで取得を試行し、中断した場合は中止し、指定されたタイムアウトが経過すると失敗します。 |
TryAcquireShared(Int32) |
共有モードで取得を試みます。 |
TryAcquireSharedNanos(Int32, Int64) |
共有モードで取得を試行し、中断した場合は中止し、指定されたタイムアウトが経過すると失敗します。 |
TryRelease(Int32) |
排他モードでリリースを反映するように状態の設定を試みます。 |
TryReleaseShared(Int32) |
共有モードのリリースを反映するように状態の設定を試みます。 |
UnregisterFromRuntime() |
先入れ先出し (FIFO) 待機キューに依存するブロック ロックと関連するシンクロナイザー (セマフォ、イベントなど) を実装するためのフレームワークを提供します。 (継承元 Object) |
Wait() |
現在のスレッドが起動するまで待機します。通常<>は、通知</em> または <em>割り込み</em によって待機します>。 (継承元 Object) |
Wait(Int64) |
現在のスレッドが起動するまで待機します。通常<>は、通知</em> または>< em 割り込み</em>、または一定のリアルタイムが経過するまで待機します。 (継承元 Object) |
Wait(Int64, Int32) |
現在のスレッドが起動するまで待機します。通常<>は、通知</em> または>< em 割り込み</em>、または一定のリアルタイムが経過するまで待機します。 (継承元 Object) |
明示的なインターフェイスの実装
IJavaPeerable.Disposed() |
先入れ先出し (FIFO) 待機キューに依存するブロック ロックと関連するシンクロナイザー (セマフォ、イベントなど) を実装するためのフレームワークを提供します。 (継承元 Object) |
IJavaPeerable.DisposeUnlessReferenced() |
先入れ先出し (FIFO) 待機キューに依存するブロック ロックと関連するシンクロナイザー (セマフォ、イベントなど) を実装するためのフレームワークを提供します。 (継承元 Object) |
IJavaPeerable.Finalized() |
先入れ先出し (FIFO) 待機キューに依存するブロック ロックと関連するシンクロナイザー (セマフォ、イベントなど) を実装するためのフレームワークを提供します。 (継承元 Object) |
IJavaPeerable.JniManagedPeerState |
先入れ先出し (FIFO) 待機キューに依存するブロック ロックと関連するシンクロナイザー (セマフォ、イベントなど) を実装するためのフレームワークを提供します。 (継承元 Object) |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
先入れ先出し (FIFO) 待機キューに依存するブロック ロックと関連するシンクロナイザー (セマフォ、イベントなど) を実装するためのフレームワークを提供します。 (継承元 Object) |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
先入れ先出し (FIFO) 待機キューに依存するブロック ロックと関連するシンクロナイザー (セマフォ、イベントなど) を実装するためのフレームワークを提供します。 (継承元 Object) |
IJavaPeerable.SetPeerReference(JniObjectReference) |
先入れ先出し (FIFO) 待機キューに依存するブロック ロックと関連するシンクロナイザー (セマフォ、イベントなど) を実装するためのフレームワークを提供します。 (継承元 Object) |
拡張メソッド
JavaCast<TResult>(IJavaObject) |
Android ランタイムチェック型変換を実行します。 |
JavaCast<TResult>(IJavaObject) |
先入れ先出し (FIFO) 待機キューに依存するブロック ロックと関連するシンクロナイザー (セマフォ、イベントなど) を実装するためのフレームワークを提供します。 |
GetJniTypeName(IJavaPeerable) |
先入れ先出し (FIFO) 待機キューに依存するブロック ロックと関連するシンクロナイザー (セマフォ、イベントなど) を実装するためのフレームワークを提供します。 |