言語

StampedLock クラス

定義

読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。

[Android.Runtime.Register("java/util/concurrent/locks/StampedLock", ApiSince=24, DoNotGenerateAcw=true)]
public class StampedLock : Java.Lang.Object, IDisposable, Java.IO.ISerializable
[<Android.Runtime.Register("java/util/concurrent/locks/StampedLock", ApiSince=24, DoNotGenerateAcw=true)>]
type StampedLock = class
    inherit Object
    interface ISerializable
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
継承
StampedLock
属性
実装

注釈

読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 StampedLock の状態は、バージョンとモードで構成されます。 ロック取得メソッドは、ロック状態に関するアクセスを表し、制御するスタンプを返します。これらのメソッドの "try" バージョンは、アクセスの取得に失敗した場合を表すために、特別な値 0 を返す場合があります。 ロック解放および変換メソッドでは、引数としてスタンプが必要であり、ロックの状態と一致しない場合は失敗します。 次の 3 つのモードがあります。

<ul>

<li><b>Writing.</b> メソッド #writeLock 排他アクセスの待機をブロックし、メソッド #unlockWrite でロックを解放するために使用できるスタンプを返す可能性があります。 tryWriteLockの時間指定されていないバージョンも提供されます。 ロックが書き込みモードで保持されている場合、読み取りロックを取得できず、すべてのオプティミスティック読み取り検証が失敗します。

<li><b>Reading.</b> メソッド #readLock 非排他的アクセスの待機をブロックし、メソッド #unlockRead でロックを解放するために使用できるスタンプを返す可能性があります。 tryReadLockの時間指定されていないバージョンも提供されます。

<li><b>最適化的な Reading.</b> メソッド #tryOptimisticRead は、ロックが現在書き込みモードで保持されていない場合にのみ、0 以外のスタンプを返します。 メソッド #validate は、特定のスタンプを取得してからロックが書き込みモードで取得されていない場合に true を返します。その場合、最新の書き込みロック解放前のすべてのアクションは、 tryOptimisticReadの呼び出しの後のアクションの前に発生します。 このモードは読み取りロックの非常に弱いバージョンと考えることができます。これは、ライターがいつでも壊れる可能性があります。 短い読み取り専用コード セグメントにオプティミスティック読み取りモードを使用すると、多くの場合、競合が減り、スループットが向上します。 しかし、その使用は本質的に脆弱です。 オプティミスティック読み取りセクションでは、フィールドのみを読み取り、検証後に後で使用できるようにローカル変数に保持する必要があります。 オプティミスティック読み取りモードの間に読み取られるフィールドは大きく矛盾する可能性があるため、一貫性を確認したり、メソッド validate()を繰り返し呼び出したりするデータ表現に十分慣れている場合にのみ使用が適用されます。 たとえば、このような手順は、通常、最初にオブジェクトまたは配列参照を読み取り、そのフィールド、要素、またはメソッドのいずれかにアクセスするときに必要です。

</ul>

このクラスは、3 つのモード間で条件付きで変換を提供するメソッドもサポートしています。 たとえば、メソッド #tryConvertToWriteLock モードの "アップグレード" を試み、(1) 既に書き込みモードで (2) 読み取りモードで他のリーダーがない場合、または (3) オプティミスティック読み取りモードでロックが使用可能な場合に有効な書き込みスタンプを返します。 これらのメソッドの形式は、再試行ベースの設計で発生するコードの肥大化の一部を減らすのに役立ちます。

StampedLocks は、スレッド セーフ コンポーネントの開発で内部ユーティリティとして使用するように設計されています。 それらの使用は、保護するデータ、オブジェクト、およびメソッドの内部プロパティに関する知識に依存します。 これらは再入可能ではないため、ロックされた本体は、ロックを再取得しようとする可能性のある他の不明なメソッドを呼び出さないでください (ただし、スタンプを使用または変換できる他のメソッドに渡すことができます)。 読み取りロック モードの使用は、関連するコード セクションが副作用のない状態に依存します。 未検証のオプティミスティック読み取りセクションでは、潜在的な不整合を許容することが不明なメソッドを呼び出すことはできません。 スタンプは有限の表現を使用し、暗号的に安全ではありません (つまり、有効なスタンプが推測できる可能性があります)。 スタンプの値は、1 年間の連続稼働後 (すぐに) リサイクルされる場合があります。 この期間を超えて使用または検証なしで保持されているスタンプは、正しく検証できない場合があります。 StampedLock はシリアル化可能ですが、常に初期ロック解除状態に逆シリアル化されるため、リモート ロックには役立ちません。

java.util.concurrent.Semaphore Semaphoreと同様ですが、ほとんどのLock実装とは異なり、StampedLocks には所有権の概念はありません。 あるスレッドで取得したロックは、別のスレッドで解放または変換できます。

StampedLock のスケジュール ポリシーでは、ライターよりもリーダーが一貫して優先されるわけではありません。また、その逆も同様です。 すべての "try" メソッドはベスト エフォートであり、スケジュール設定や公平性ポリシーに必ずしも準拠しているわけではありません。 ロックを取得または変換するための "try" メソッドから 0 を返しても、ロックの状態に関する情報は保持されません。後続の呼び出しは成功する可能性があります。

複数のロック モード間で調整された使用をサポートするため、このクラスは Lock または ReadWriteLock インターフェイスを直接実装しません。 ただし、関連付けられている一連の機能のみを必要とするアプリケーションでは、StampedLock #asReadLock()#asWriteLock()、または #asReadWriteLock() を表示できます。

<b>Memory Synchronization.</b> 任意のモードで正常にロックされる効果を持つメソッドは、<em>Lock</em> アクションと同じメモリ同期効果を持ちます(<cite>Java言語仕様</引用>の第 17 章で説明します。 書き込みモードで正常にロック解除されたメソッドは、 <em>Unlock</em> アクションと同じメモリ同期効果を持ちます。 オプティミスティック読み取り使用では、最新の書き込みモードのロック解除アクションより前のアクションは、後で検証が true を返した場合にのみ、tryOptimisticRead に続くアクションよりも前に発生することが保証されます。それ以外の場合、tryOptimisticRead と検証の間の読み取りで一貫性のあるスナップショットが取得される保証はありません。

<b>Sample Usage.</b> 次に示すのは、単純な 2 次元ポイントを維持するクラス内の使用法のイディオムです。 このサンプル コードは、本体で例外が発生しないため、ここでは厳密に必要とされない場合でも、いくつかの try/catch 規則を示しています。

{@code
            class Point {
              private double x, y;
              private final StampedLock sl = new StampedLock();

              // an exclusively locked method
              void move(double deltaX, double deltaY) {
                long stamp = sl.writeLock();
                try {
                  x += deltaX;
                  y += deltaY;
                } finally {
                  sl.unlockWrite(stamp);
                }
              }

              // a read-only method
              // upgrade from optimistic read to read lock
              double distanceFromOrigin() {
                long stamp = sl.tryOptimisticRead();
                try {
                  retryHoldingLock: for (;; stamp = sl.readLock()) {
                    if (stamp == 0L)
                      continue retryHoldingLock;
                    // possibly racy reads
                    double currentX = x;
                    double currentY = y;
                    if (!sl.validate(stamp))
                      continue retryHoldingLock;
                    return Math.hypot(currentX, currentY);
                  }
                } finally {
                  if (StampedLock.isReadLockStamp(stamp))
                    sl.unlockRead(stamp);
                }
              }

              // upgrade from optimistic read to write lock
              void moveIfAtOrigin(double newX, double newY) {
                long stamp = sl.tryOptimisticRead();
                try {
                  retryHoldingLock: for (;; stamp = sl.writeLock()) {
                    if (stamp == 0L)
                      continue retryHoldingLock;
                    // possibly racy reads
                    double currentX = x;
                    double currentY = y;
                    if (!sl.validate(stamp))
                      continue retryHoldingLock;
                    if (currentX != 0.0 || currentY != 0.0)
                      break;
                    stamp = sl.tryConvertToWriteLock(stamp);
                    if (stamp == 0L)
                      continue retryHoldingLock;
                    // exclusive access
                    x = newX;
                    y = newY;
                    return;
                  }
                } finally {
                  if (StampedLock.isWriteLockStamp(stamp))
                    sl.unlockWrite(stamp);
                }
              }

              // upgrade read lock to write lock
              void moveIfAtOrigin2(double newX, double newY) {
                long stamp = sl.readLock();
                try {
                  while (x == 0.0 && y == 0.0) {
                    long ws = sl.tryConvertToWriteLock(stamp);
                    if (ws != 0L) {
                      stamp = ws;
                      x = newX;
                      y = newY;
                      break;
                    }
                    else {
                      sl.unlockRead(stamp);
                      stamp = sl.writeLock();
                    }
                  }
                } finally {
                  sl.unlock(stamp);
                }
              }
            }}

1.8 で追加されました。

java.util.concurrent.locks.StampedLockの Java ドキュメント。

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

コンストラクター

名前 説明
StampedLock()

最初はロック解除状態の新しいロックを作成します。

StampedLock(IntPtr, JniHandleOwnership)

JNI オブジェクトのマネージド表現を初期化します。 このコンストラクターはランタイムによって呼び出されます。

プロパティ

名前 説明
Class

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

(継承元 Object)
Handle

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

(継承元 Object)
IsReadLocked

ロックが非排他的に現在保持されている場合は、 true を返します。

IsWriteLocked

ロックが現在排他的に保持されている場合は、 true を返します。

JniIdentityHashCode

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

(継承元 Object)
JniManagedPeerState

読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。

(継承元 JavaObject)
JniPeerMembers

このJava ピアのメンバーを呼び出すために使用される JNI メタデータを取得します。

PeerReference

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

(継承元 Object)
ReadLockCount

このロックに保持されている読み取りロックの数を照会します。

ThresholdClass

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

ThresholdType

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

メソッド

名前 説明
AsReadLock()

Lock メソッドがLock#lockにマップされ、他のメソッドの場合と同様に、この StampedLock のプレーンな#readLock ビューを返します。

AsReadWriteLock()

ReadWriteLock メソッドを ReadWriteLock#readLock() にマップし、#asReadLock()ReadWriteLock#writeLock()するこの StampedLock の#asWriteLock() ビューを返します。

AsWriteLock()

Lock メソッドがLock#lockにマップされ、他のメソッドの場合と同様に、この StampedLock のプレーンな#writeLock ビューを返します。

Clone()

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

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

読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。

(継承元 JavaObject)
Dispose()

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

(継承元 Object)
Dispose(Boolean)

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

(継承元 Object)
DisposeUnlessReferenced()

読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。

(継承元 JavaObject)
Equals(Object)

読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。

(継承元 JavaObject)
Equals(Object)

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

(継承元 Object)
GetHashCode()

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

(継承元 Object)
IsLockStamp(Int64)

スタンプがロックを保持しているかどうかを示します。

IsOptimisticReadStamp(Int64)

スタンプが正常なオプティミスティック読み取りを表すかどうかを示します。

IsReadLockStamp(Int64)

スタンプがロックを非排他的に保持するかどうかを示します。

IsWriteLockStamp(Int64)

スタンプがロックを排他的に保持するかどうかを示します。

JavaFinalize()
古い.

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

(継承元 Object)
Notify()

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

(継承元 Object)
NotifyAll()

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

(継承元 Object)
ReadLock()

非排他的にロックを取得し、必要に応じてブロックし、使用可能になるまでブロックします。

ReadLockInterruptibly()

ロックを排他的に取得し、必要に応じて、使用可能または現在のスレッドが中断されるまでブロックします。

SetHandle(IntPtr, JniHandleOwnership)

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

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

読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。

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

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

(継承元 Object)
ToString()

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

(継承元 Object)
TryConvertToOptimisticRead(Int64)

ロック状態が指定されたスタンプと一致する場合は、アトミックに、スタンプがロックを保持している場合は、それを解放し、監視スタンプを返します。

TryConvertToReadLock(Int64)

ロック状態が指定されたスタンプと一致する場合は、次のいずれかのアクションをアトミックに実行します。

TryConvertToWriteLock(Int64)

ロック状態が指定されたスタンプと一致する場合は、次のいずれかのアクションをアトミックに実行します。

TryOptimisticRead()

後で検証できるスタンプを返します。排他的にロックされている場合は 0 を返します。

TryReadLock()

すぐに使用可能な場合は、非排他的にロックを取得します。

TryReadLock(Int64, TimeUnit)

ロックが特定の時間内に使用可能であり、現在のスレッドが中断されていない場合は、非排他的にロックを取得します。

TryUnlockRead()

読み取りロックが保持されている場合は、スタンプ値を必要とせずに、読み取りロックの 1 つの保留を解放します。

TryUnlockWrite()

書き込みロックが保持されている場合は、スタンプ値を必要とせずに解放します。

TryWriteLock()

すぐに使用可能な場合は、ロックを排他的に取得します。

TryWriteLock(Int64, TimeUnit)

特定の時間内に使用可能であり、現在のスレッドが中断されていない場合は、ロックを排他的に取得します。

Unlock(Int64)

ロック状態が指定されたスタンプと一致する場合は、対応するロック モードを解放します。

UnlockRead(Int64)

ロック状態が指定されたスタンプと一致する場合は、非排他ロックを解放します。

UnlockWrite(Int64)

ロック状態が指定されたスタンプと一致する場合は、排他ロックを解放します。

UnregisterFromRuntime()

相互運用ランタイムからこのJava ピアの登録を解除します。

(継承元 Object)
Validate(Int64)

指定されたスタンプの発行以降にロックが排他的に取得されていない場合は true を返します。

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)
WriteLock()

ロックを排他的に取得し、必要に応じて、使用可能になるまでブロックします。

WriteLockInterruptibly()

ロックを排他的に取得し、必要に応じて、使用可能になるまで、または現在のスレッドが中断されるまでブロックします。

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

名前 説明
IJavaPeerable.Disposed()

読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。

(継承元 JavaObject)
IJavaPeerable.Finalized()

読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。

(継承元 JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。

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

読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。

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

読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。

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

読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。

(継承元 JavaObject)
IJavaPeerable.UnregisterFromRuntime()

読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。

拡張メソッド

名前 説明
GetJniTypeName(IJavaPeerable)

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

JavaAs<TResult>(IJavaPeerable)

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

JavaCast<TResult>(IJavaObject)

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

JavaCast<TResult>(IJavaObject)

読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。

TryJavaCast<TResult>(IJavaPeerable, TResult)

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

適用対象