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
で使用できるスタンプを返す可能性があります。 Untimed バージョンと Timed バージョン tryWriteLock
も提供されます。 ロックが書き込みモードで保持されている場合、読み取りロックを取得できず、すべてのオプティミスティック読み取り検証が失敗します。
<li><b>Reading.</b> メソッド #readLock
は、非排他的アクセスの待機をブロックし、メソッド #unlockRead
でロックを解放するために使用できるスタンプを返す可能性があります。 Untimed バージョンと Timed バージョン tryReadLock
も提供されます。
<li><b>オプティミスティック読み取り。</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 を返しても、ロックの状態に関する情報は保持されません。後続の呼び出しは成功する可能性があります。
複数のロック モード間で調整された使用をサポートするため、このクラスは直接、またはReadWriteLock
インターフェイスをLock
実装しません。 ただし、StampedLock を表示したり#asReadWriteLock()
、#asWriteLock()
関連付けられている機能のセットのみを必要とするアプリケーションで表示#asReadLock()
したりできます。
<b>メモリ同期。</b> 任意のモードで正常にロックする効果を持つメソッドは、java 言語仕様</引用>の第 17>< 章で説明されているように、em>Lock</em> アクションと同じメモリ同期効果<を持ちます。 書き込みモードで正常にロック解除されたメソッドは、em>Unlock</em> アクションと同じメモリ同期効果を<持っています。 オプティミスティック読み取りの使用では、最新の書き込みモードのロック解除アクションより前のアクションは、tryOptimisticRead の後に続くアクションが true を返す場合にのみ発生することが保証されます。それ以外の場合、tryOptimisticRead と検証の間の読み取りで一貫性のあるスナップショットが取得される保証はありません。
<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
このページの一部は、Android オープンソース プロジェクトによって作成および共有され、クリエイティブ コモンズ 2.5 属性ライセンスに記載されている条件に従って使用される作業に基づく変更です。
コンストラクター
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, Int32) |
現在のスレッドが目覚めるまで待機します。通常<><は、通知/em> または <em>中断</em> によって、または一定のリアルタイムが経過するまで待機します。 (継承元 Object) |
Wait(Int64) |
現在のスレッドが目覚めるまで待機します。通常<><は、通知/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 つのモードを備えた機能ベースのロック。 |