AbstractQueuedSynchronizer クラス

定義

先入れ先出し (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
継承
AbstractQueuedSynchronizer
属性
実装

注釈

先入れ先出し (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 インスタンスを作成します。

AbstractQueuedSynchronizer(IntPtr, JniHandleOwnership)

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

プロパティ

Class

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

(継承元 Object)
ExclusiveOwnerThread

によって最後に設定された setExclusiveOwnerThreadスレッドを返します。設定 null しない場合は を返します。 または、現在排他アクセスを所有しているスレッドを設定します。

(継承元 AbstractOwnableSynchronizer)
ExclusiveQueuedThreads

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

FirstQueuedThread

キュー内の最初の (最も長く待機している) スレッドを返します。または null 、現在キューに入っているスレッドがない場合は を返します。

Handle

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

(継承元 Object)
HasContended

このシンクロナイザーの取得を意図したスレッドがあるかどうかをクエリします。つまり、acquire メソッドがブロックされた場合です。

HasQueuedPredecessors

現在のスレッドよりも長い取得を待機しているスレッドがあるかどうかを照会します。

HasQueuedThreads

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

IsHeldExclusively

同期が現在の true (呼び出し元) スレッドに対して排他的に保持されている場合は を返します。

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) 待機キューに依存するブロック ロックと関連するシンクロナイザー (セマフォ、イベントなど) を実装するためのフレームワークを提供します。

適用対象