ReentrantReadWriteLock クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
ReadWriteLockと同様のセマンティクスをサポートするReentrantLockの実装。
[Android.Runtime.Register("java/util/concurrent/locks/ReentrantReadWriteLock", DoNotGenerateAcw=true)]
public class ReentrantReadWriteLock : Java.Lang.Object, IDisposable, Java.IO.ISerializable, Java.Util.Concurrent.Locks.IReadWriteLock
[<Android.Runtime.Register("java/util/concurrent/locks/ReentrantReadWriteLock", DoNotGenerateAcw=true)>]
type ReentrantReadWriteLock = class
inherit Object
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
interface IReadWriteLock
- 継承
- 属性
- 実装
注釈
ReadWriteLockと同様のセマンティクスをサポートするReentrantLockの実装。
このクラスには、次のプロパティがあります。
<ul><li><b>Acquisition order</b>
このクラスでは、ロック アクセスのリーダーまたはライターの優先順序は設定されません。 ただし、オプションの <em>fairness</em> ポリシーがサポートされます。
<dl><dt><b>非公平モード (既定)</b><dd>非公平 (既定) として構築された場合、再入制約の対象となる読み取り/書き込みロックへのエントリの順序が指定されていません。 継続的に意図されている非ペア ロックは、1 つ以上のリーダーまたはライター スレッドを無期限に延期できますが、通常はフェア ロックよりも高いスループットになります。
<dt><b>Fair mode</b><dd> fair として構築された場合、スレッドは約到着順ポリシーを使用してエントリを競合します。 現在保持されているロックが解放されると、待機時間が最も長い 1 つのライター スレッドに書き込みロックが割り当てられるか、待機しているすべてのライター スレッドよりも長く待機しているリーダー スレッドのグループがある場合は、そのグループに読み取りロックが割り当てられます。
書き込みロックが保持されているか、待機中のライター スレッドがある場合、(再入不可に) 公平な読み取りロックを取得しようとするスレッドはブロックされます。 現在待機している最も古いライター スレッドが書き込みロックを取得して解放するまで、スレッドは読み取りロックを取得しません。 もちろん、待機中のライターが待機を破棄し、1 つ以上のリーダー スレッドを書き込みロックのないキューで最も長い待機者として残した場合、それらのリーダーには読み取りロックが割り当てられます。
読み取りロックと書き込みロックの両方が空でない限り、(再入不可の) 公正な書き込みロックを取得しようとするスレッドはブロックされます (待機中のスレッドがないことを意味します)。 (非ブロッキング ReadLock#tryLock() メソッドと WriteLock#tryLock() メソッドは、この公平な設定を優先せず、待機中のスレッドに関係なく、可能であればすぐにロックを取得することに注意してください)。) </dl>
<li><b>Reentrancy</b>
このロックにより、リーダーとライターの両方が、 ReentrantLockのスタイルで読み取りロックまたは書き込みロックを再取得できます。 再入可能でないリーダーは、書き込みスレッドによって保持されているすべての書き込みロックが解放されるまで許可されません。
さらに、ライターは読み取りロックを取得できますが、その逆は取得できません。 他のアプリケーションの中でも、再入は、読み取りロックで読み取りを実行するメソッドへの呼び出しまたはコールバック中に書き込みロックが保持されている場合に役立ちます。 リーダーが書き込みロックを取得しようとすると、成功することはありません。
<li><b>Lock ダウングレード</b>
再入では、書き込みロックを取得し、読み取りロックを取得してから書き込みロックを解放することで、書き込みロックから読み取りロックにダウングレードすることもできます。 ただし、読み取りロックから書き込みロックへのアップグレードは <b>できません</b> 。
<li><b>ロック取得の中断</b>
読み取りロックと書き込みロックの両方で、ロック取得中の中断がサポートされます。
<li><b>Condition サポート</b>
書き込みロックは、書き込みロックに関して同じように動作するCondition実装を提供します。これは、ConditionがReentrantLock#newConditionに対して提供するReentrantLock実装と同じです。 この Condition は、もちろん書き込みロックでのみ使用できます。
読み取りロックは Condition をサポートせず、 readLock().newCondition() は UnsupportedOperationExceptionをスローします。
<li><b>Instrumentation</b>
このクラスは、ロックが保持されているか、または意図されているかを判断するメソッドをサポートします。 これらのメソッドは、同期制御ではなく、システムの状態を監視するために設計されています。 </ul>
このクラスのシリアル化は、組み込みロックと同じように動作します。逆シリアル化されたロックは、シリアル化時の状態に関係なく、ロック解除状態になります。
<b>Sample usages.</b> キャッシュの更新後にロックのダウングレードを実行する方法を示すコード スケッチを次に示します (入れ子になっていない方法で複数のロックを処理する場合、例外処理は特に難しいです)。
{@code
class CachedData {
Object data;
boolean cacheValid;
final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
void processCachedData() {
rwl.readLock().lock();
if (!cacheValid) {
// Must release read lock before acquiring write lock
rwl.readLock().unlock();
rwl.writeLock().lock();
try {
// Recheck state because another thread might have
// acquired write lock and changed state before we did.
if (!cacheValid) {
data = ...;
cacheValid = true;
}
// Downgrade by acquiring read lock before releasing write lock
rwl.readLock().lock();
} finally {
rwl.writeLock().unlock(); // Unlock write, still hold read
}
}
try {
use(data);
} finally {
rwl.readLock().unlock();
}
}
}}
ReentrantReadWriteLocks を使用すると、一部の種類のコレクションを使用する場合のコンカレンシーを向上させることができます。 これは通常、コレクションが大きく、ライター スレッドよりも多くのリーダー スレッドによってアクセスされ、同期オーバーヘッドを上回るオーバーヘッドを伴う操作を伴う場合にのみ価値があります。 たとえば、TreeMap を使用するクラスは、大規模で同時にアクセスされることが予想されます。
{@code
class RWDictionary {
private final Map<String, Data> m = new TreeMap<>();
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private final Lock r = rwl.readLock();
private final Lock w = rwl.writeLock();
public Data get(String key) {
r.lock();
try { return m.get(key); }
finally { r.unlock(); }
}
public List<String> allKeys() {
r.lock();
try { return new ArrayList<>(m.keySet()); }
finally { r.unlock(); }
}
public Data put(String key, Data value) {
w.lock();
try { return m.put(key, value); }
finally { w.unlock(); }
}
public void clear() {
w.lock();
try { m.clear(); }
finally { w.unlock(); }
}
}}
<h2>実装に関する注意事項</h2>
このロックでは、最大 65535 個の再帰書き込みロックと 65535 個の読み取りロックがサポートされます。 これらの制限を超えようとすると、 Error はメソッドのロックからスローされます。
1\.5 で追加されました。
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。
コンストラクター
| 名前 | 説明 |
|---|---|
| ReentrantReadWriteLock() |
既定の (非ペア) 順序付けプロパティを使用して、新しい |
| ReentrantReadWriteLock(Boolean) |
指定された公平性ポリシーを使用して新しい |
| ReentrantReadWriteLock(IntPtr, JniHandleOwnership) |
JNI オブジェクトのマネージド表現を作成するときに使用されるコンストラクター。ランタイムによって呼び出されます。 |
プロパティ
| 名前 | 説明 |
|---|---|
| Class |
この |
| Handle |
基になる Android インスタンスへのハンドル。 (継承元 Object) |
| HasQueuedThreads |
スレッドが読み取りまたは書き込みロックの取得を待機しているかどうかをクエリします。 |
| IsFair |
このロックに公平性が true に設定されている場合は、 |
| IsWriteLocked |
書き込みロックが任意のスレッドによって保持されている場合にクエリを実行します。 |
| IsWriteLockedByCurrentThread |
書き込みロックが現在のスレッドによって保持されている場合にクエリを実行します。 |
| JniIdentityHashCode |
相互運用ランタイムによってこのJava ピアに割り当てられた ID ハッシュ コードを取得します。 (継承元 Object) |
| JniManagedPeerState |
|
| JniPeerMembers |
このJava ピアのメンバーを呼び出すために使用される JNI メタデータを取得します。 |
| Owner |
現在書き込みロックを所有しているスレッドを返します。所有していない場合は |
| PeerReference |
このJava ピアの JNI オブジェクト参照を取得します。 (継承元 Object) |
| QueuedReaderThreads |
読み取りロックの取得を待機している可能性があるスレッドを含むコレクションを返します。 |
| QueuedThreads |
読み取りまたは書き込みロックの取得を待機している可能性があるスレッドを含むコレクションを返します。 |
| QueuedWriterThreads |
書き込みロックの取得を待機している可能性があるスレッドを含むコレクションを返します。 |
| QueueLength |
読み取りまたは書き込みロックの取得を待機しているスレッドの数の推定値を返します。 |
| ReadHoldCount |
現在のスレッドによるこのロックに対する再入可能な読み取り保留の数を照会します。 |
| ReadLockCount |
このロックに保持されている読み取りロックの数を照会します。 |
| ThresholdClass |
この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。 |
| ThresholdType |
この API は Android 用 Mono インフラストラクチャをサポートしており、コードから直接使用するためのものではありません。 |
| WriteHoldCount |
現在のスレッドによるこのロックに対する再入可能な書き込みホールドの数を照会します。 |
メソッド
| 名前 | 説明 |
|---|---|
| Clone() |
このオブジェクトのコピーを作成して返します。 (継承元 Object) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
|
| Dispose() |
このJava ピアによって保持されているリソースを解放します。 (継承元 Object) |
| Dispose(Boolean) |
このJava ピアによって保持されているリソースを解放します。 (継承元 Object) |
| DisposeUnlessReferenced() |
|
| Equals(Object) |
|
| Equals(Object) |
他のオブジェクトがこのオブジェクトと "等しい" かどうかを示します。 (継承元 Object) |
| GetHashCode() |
オブジェクトのハッシュ コード値を返します。 (継承元 Object) |
| GetWaitingThreads(ICondition) |
書き込みロックに関連付けられている特定の条件で待機している可能性があるスレッドを含むコレクションを返します。 |
| GetWaitQueueLength(ICondition) |
書き込みロックに関連付けられている特定の条件を待機しているスレッドの数の推定値を返します。 |
| HasQueuedThread(Thread) |
指定されたスレッドが読み取りロックまたは書き込みロックの取得を待機しているかどうかをクエリします。 |
| HasWaiters(ICondition) |
書き込みロックに関連付けられている特定の条件でスレッドが待機しているかどうかをクエリします。 |
| JavaFinalize() |
オブジェクトへの参照がなくなったとガベージ コレクションによって判断されたときに、オブジェクトのガベージ コレクターによって呼び出されます。 (継承元 Object) |
| Notify() |
このオブジェクトのモニターで待機している 1 つのスレッドを起動します。 (継承元 Object) |
| NotifyAll() |
このオブジェクトのモニターで待機しているすべてのスレッドを起動します。 (継承元 Object) |
| ReadLock() |
読み取りに使用するロックを返します。 |
| SetHandle(IntPtr, JniHandleOwnership) |
Handle プロパティを設定します。 (継承元 Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
|
| ToArray<T>() |
このJava配列ラッパーからマネージド配列を作成します。 (継承元 Object) |
| ToString() |
オブジェクトの文字列表現を返します。 (継承元 Object) |
| UnregisterFromRuntime() |
相互運用ランタイムからこのJava ピアの登録を解除します。 (継承元 Object) |
| 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() |
書き込みに使用するロックを返します。 |
明示的なインターフェイスの実装
| 名前 | 説明 |
|---|---|
| IJavaPeerable.Disposed() |
|
| IJavaPeerable.Finalized() |
|
| IJavaPeerable.JniObjectReferenceControlBlock |
|
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
|
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
|
| IJavaPeerable.SetPeerReference(JniObjectReference) |
|
| IJavaPeerable.UnregisterFromRuntime() |
|
拡張メソッド
| 名前 | 説明 |
|---|---|
| GetJniTypeName(IJavaPeerable) |
インスタンス |
| JavaAs<TResult>(IJavaPeerable) |
|
| JavaCast<TResult>(IJavaObject) |
Android ランタイムチェック型変換を実行します。 |
| JavaCast<TResult>(IJavaObject) |
|
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
|