StampedLock クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。
[Android.Runtime.Register("java/util/concurrent/locks/StampedLock", ApiSince=24, DoNotGenerateAcw=true)]
public class StampedLock : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, 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
- 継承
- 属性
- 実装
注釈
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 StampedLock の状態は、バージョンとモードで構成されます。 ロック取得メソッドは、ロック状態に関するアクセスを表し、制御するスタンプを返します。これらのメソッドの "try" バージョンでは、代わりに特別な値 0 が返され、アクセスの取得に失敗した場合を表す場合があります。 ロック解放メソッドと変換メソッドでは、引数としてスタンプが必要であり、ロックの状態と一致しない場合は失敗します。 次の 3 つのモードがあります:
<ul>
<li><b>Writing.</b> メソッドは #writeLock
、排他アクセスの待機をブロックし、メソッド #unlockWrite
でロックを解除するために使用できるスタンプを返す可能性があります。 のタイムなしバージョンと時間指定バージョン tryWriteLock
も用意されています。 ロックが書き込みモードで保持されている場合、読み取りロックが取得されない可能性があり、すべてのオプティミスティック読み取り検証は失敗します。
<li><b>Reading.</b> メソッド #readLock
は、非排他的アクセスの待機をブロックし、メソッド #unlockRead
でロックを解放するために使用できるスタンプを返す可能性があります。 のタイムなしバージョンと時間指定バージョン tryReadLock
も用意されています。
<li><b>オプティミスティック読み取り。</b> メソッド #tryOptimisticRead
は、ロックが現在書き込みモードで保持されていない場合にのみ、0 以外のスタンプを返します。 特定のスタンプを取得してからロックが書き込みモードで取得されていない場合、メソッド #validate
は true を返します。その場合、最新の書き込みロック解放前のすべてのアクションは、 の呼び出しの後のアクションの前に発生します tryOptimisticRead
。 このモードは、読み取りロックの非常に弱いバージョンと考えることができます。これは、ライターがいつでも壊れる可能性があります。 短い読み取り専用コード セグメントにオプティミスティック読み取りモードを使用すると、多くの場合、競合が減少し、スループットが向上します。 しかし、その使用は本質的に脆弱です。 オプティミスティック読み取りセクションでは、後で検証後に使用するために、フィールドのみを読み取り、ローカル変数に保持する必要があります。 オプティミスティック読み取りモードの間に読み取られるフィールドは大きく矛盾する可能性があるため、データ表現に十分に慣れている場合にのみ使用が適用され、一貫性をチェックしたり、メソッド validate()
を繰り返し呼び出したりします。 たとえば、このような手順は通常、最初にオブジェクトまたは配列参照を読み取ってから、そのフィールド、要素、またはメソッドのいずれかにアクセスするときに必要です。
</ul>
このクラスでは、3 つのモード間で条件付きで変換を提供するメソッドもサポートされています。 たとえば、(1) が既に読み取りモードで書き込みモード (2) にあり、他のリーダーがない場合、または (3) オプティミスティック読み取りモードでロックが使用可能な場合、メソッド #tryConvertToWriteLock
はモードの "アップグレード" を試み、有効な書き込みスタンプを返します。 これらのメソッドの形式は、再試行ベースの設計で発生するコードの肥大化の一部を減らすために設計されています。
StampedLocks は、スレッド セーフ コンポーネントの開発において内部ユーティリティとして使用するように設計されています。 それらの使用は、保護するデータ、オブジェクト、およびメソッドの内部プロパティに関する知識に依存します。 これらは再入可能ではないため、ロックされた本体は、ロックを再取得しようとする可能性のある他の不明なメソッドを呼び出さないでください (ただし、それを使用または変換できる他のメソッドにスタンプを渡すことができます)。 読み取りロック モードの使用は、関連するコード セクションが副作用のない状態に依存します。 検証されていないオプティミスティック読み取りセクションでは、潜在的な不整合を許容することが不明なメソッドを呼び出すことはできません。 スタンプは有限表現を使用し、暗号的に安全ではありません (つまり、有効なスタンプが推測できる可能性があります)。 スタンプ値は、1 年間の連続操作の後 (早く) リサイクルされる場合があります。 この期間を超えて使用または検証なしで保持されているスタンプが正しく検証されない場合があります。 StampedLocks はシリアル化可能ですが、常に初期ロック解除状態に逆シリアル化されるため、リモート ロックには役立ちません。
と同様 java.util.concurrent.Semaphore Semaphore
ですが、ほとんどの Lock
実装とは異なり、StampedLocks には所有権の概念はありません。 あるスレッドで取得したロックは、別のスレッドで解放または変換できます。
StampedLock のスケジュール ポリシーでは、ライターよりもリーダーを優先しないか、またはその逆が一貫して優先されません。 すべての "try" メソッドはベスト エフォートであり、スケジュール設定や公平性ポリシーに必ずしも準拠しているわけではありません。 ロックを取得または変換するための "try" メソッドから 0 を返しても、ロックの状態に関する情報は保持されません。後続の呼び出しは成功する可能性があります。
複数のロック モード間での調整された使用がサポートされているため、このクラスは インターフェイスまたは ReadWriteLock
インターフェイスをLock
直接実装しません。 ただし、関連付けられた一連の機能のみを必要とするアプリケーションでは、StampedLock を表示#asReadLock()
#asWriteLock()
できます#asReadWriteLock()
。
<b>メモリ同期。</b> 任意のモードで正常にロックする効果を持つメソッドは、「Java 言語仕様</>引用」の第 17 <>章で説明されているように、em>Lock</em> アクションと同じメモリ同期効果<を持ちます。 書き込みモードで正常にロック解除されたメソッドには、em>Unlock</em> アクションと<同じメモリ同期効果があります。 オプティミスティック読み取りの使用では、最新の書き込みモードのロック解除アクションより前のアクションは、tryOptimisticRead の後に続くアクションが true を返す場合にのみ発生することが保証されます。それ以外の場合は、tryOptimisticRead と validate の間の読み取りによって一貫性のあるスナップショットが取得される保証はありません。
<b>サンプルの使用法。</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 ドキュメント java.util.concurrent.locks.StampedLock
。
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。
コンストラクター
StampedLock() |
最初はロック解除状態の新しいロックを作成します。 |
StampedLock(IntPtr, JniHandleOwnership) |
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 |
プロパティ
Class |
この |
Handle |
基になる Android インスタンスへのハンドル。 (継承元 Object) |
IsReadLocked |
|
IsWriteLocked |
ロックが |
JniIdentityHashCode |
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 (継承元 Object) |
JniPeerMembers |
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 |
PeerReference |
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 (継承元 Object) |
ReadLockCount |
このロックに対して保持されている読み取りロックの数を照会します。 |
ThresholdClass |
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 |
ThresholdType |
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 |
メソッド
AsReadLock() |
メソッドが にマップされ |
AsReadWriteLock() |
メソッドが |
AsWriteLock() |
メソッドが にマップされ |
Clone() |
このオブジェクトのコピーを作成して返します。 (継承元 Object) |
Dispose() |
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 (継承元 Object) |
Dispose(Boolean) |
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 (継承元 Object) |
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) |
ToArray<T>() |
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 (継承元 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() |
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 (継承元 Object) |
Validate(Int64) |
指定されたスタンプの発行後にロックが排他的に取得されていない場合は true を返します。 |
Wait() |
現在のスレッドが起動するまで待機します。通常<>は、通知</em> または <em>割り込み</em によって待機します>。 (継承元 Object) |
Wait(Int64) |
現在のスレッドが起動するまで待機します。通常<>は、通知</em> または>< em 割り込み</em>、または一定のリアルタイムが経過するまで待機します。 (継承元 Object) |
Wait(Int64, Int32) |
現在のスレッドが起動するまで待機します。通常<>は、通知</em> または>< em 割り込み</em>、または一定のリアルタイムが経過するまで待機します。 (継承元 Object) |
WriteLock() |
ロックを排他的に取得し、必要に応じて、使用可能になるまでブロックします。 |
WriteLockInterruptibly() |
ロックを排他的に取得し、使用可能になるまで、または現在のスレッドが中断されるまで、必要に応じてブロックします。 |
明示的なインターフェイスの実装
IJavaPeerable.Disposed() |
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 (継承元 Object) |
IJavaPeerable.DisposeUnlessReferenced() |
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 (継承元 Object) |
IJavaPeerable.Finalized() |
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 (継承元 Object) |
IJavaPeerable.JniManagedPeerState |
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 (継承元 Object) |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 (継承元 Object) |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 (継承元 Object) |
IJavaPeerable.SetPeerReference(JniObjectReference) |
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 (継承元 Object) |
拡張メソッド
JavaCast<TResult>(IJavaObject) |
Android ランタイムチェック型変換を実行します。 |
JavaCast<TResult>(IJavaObject) |
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 |
GetJniTypeName(IJavaPeerable) |
読み取り/書き込みアクセスを制御するための 3 つのモードを備えた機能ベースのロック。 |