ILock インターフェイス

定義

Lock 実装では、メソッドとステートメントを使用して synchronized 取得できるよりも広範なロック操作が提供されます。

[Android.Runtime.Register("java/util/concurrent/locks/Lock", "", "Java.Util.Concurrent.Locks.ILockInvoker")]
public interface ILock : Android.Runtime.IJavaObject, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("java/util/concurrent/locks/Lock", "", "Java.Util.Concurrent.Locks.ILockInvoker")>]
type ILock = interface
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
派生
属性
実装

注釈

Lock 実装では、メソッドとステートメントを使用して synchronized 取得できるよりも広範なロック操作が提供されます。 より柔軟な構造化が可能で、プロパティが大きく異なる場合があり、複数の関連 Condition オブジェクトをサポートする場合があります。

ロックは、複数のスレッドによる共有リソースへのアクセスを制御するためのツールです。 一般的に、ロックは共有リソースへの排他アクセスを提供します。一度に 1 つのスレッドのみがロックを取得でき、共有リソースへのすべてのアクセスでは、最初にロックを取得する必要があります。 ただし、一部のロックでは、 の読み取りロックなど、共有リソースへの同時アクセスが ReadWriteLock許可される場合があります。

メソッドまたはステートメントを使用すると、すべてのオブジェクトに関連付けられている暗黙的なモニター ロックにアクセスできますが、すべてのロックの取得と解放がブロック構造の方法で強制的に実行されます。複数の synchronized ロックが取得された場合は、逆の順序で解放する必要があり、すべてのロックは取得されたのと同じ構文スコープで解放する必要があります。

メソッドとステートメントのスコープメカニズム synchronized を使用すると、モニター ロックを使用したプログラミングがはるかに簡単になり、ロックに関連する多くの一般的なプログラミング エラーを回避するのに役立ちますが、より柔軟な方法でロックを操作する必要がある場合があります。 たとえば、同時にアクセスされるデータ構造を走査するための一部のアルゴリズムでは、" を使用する必要があります。hand-over-hand"または quot を &します。チェーン ロック": ノード A のロックを取得してからノード B を取得し、A を解放して C を取得してから、B を解放して D などを取得します。 インターフェイスの Lock 実装では、さまざまなスコープでロックを取得および解放し、複数のロックを任意の順序で取得および解放できるようにすることで、このような手法を使用できます。

この柔軟性の向上に伴い、追加の責任が伴います。 ブロック構造化ロックが存在しない場合、メソッドとステートメントで synchronized 発生するロックの自動解放が削除されます。 ほとんどの場合、次の慣用句を使用する必要があります。

{@code
            Lock l = ...;
            l.lock();
            try {
              // access the resource protected by this lock
            } finally {
              l.unlock();
            }}

ロックとロック解除が異なるスコープで発生する場合は、ロックが保持されている間に実行されるすべてのコードが try-finally または try-catch によって保護され、必要に応じてロックが解放されるように注意する必要があります。

Lock実装では、ロックをsynchronized取得する非ブロッキング試行 ()、中断可能なロックの取得の試行 (およびタイムアウト#tryLock(long, TimeUnit)可能なロックの取得の試行)#tryLock()#lockInterruptibly を提供することで、メソッドとステートメントの使用に関する追加の機能が提供されます。

Lockクラスは、保証された順序付け、再入不可の使用、デッドロック検出など、暗黙的なモニター ロックとは大きく異なる動作とセマンティクスを提供することもできます。 実装でこのような特殊なセマンティクスが提供される場合、実装ではそれらのセマンティクスを文書化する必要があります。

Lockインスタンスは通常のオブジェクトに過ぎず、それ自体をステートメントのターゲットとして使用できることにsynchronized注意してください。 インスタンスのモニター ロックを取得しても、 Lock そのインスタンスの #lock メソッドの呼び出しとの関係は指定されません。 混乱を避けるために、独自の実装内を除き、この方法ではインスタンスを使用 Lock しないようにすることをお勧めします。

特に記載されている場合を除き、パラメーターに値を null 渡すと、 NullPointerException がスローされます。

<h2>メモリ同期</h2>

すべての実装 em は、組み込みのモニター ロックによって提供されるのと同じメモリ同期セマンティクスを適用する必要があります<>。これは、cite>の第 17 <章「Java 言語仕様</引用>: <ul<>li>A 成功lockした操作は、em Lock</em> アクションの成功><と同じメモリ同期効果を持ちます。><Lock <li>成功した unlock 操作は、正常 <な em>Unlock</em> アクションと同じメモリ同期効果を持っています。 </ul>

ロック操作とロック解除操作の失敗、および再入可能なロック/ロック解除操作では、メモリ同期の影響は必要ありません。

<h2>実装に関する考慮事項</h2>

ロック取得の 3 つの形式 (割り込み可能、割り込み不可、およびタイミング) は、パフォーマンス特性、順序保証、またはその他の実装品質で異なる場合があります。 また、ロックの継続的/em> 取得を<>中断する機能は、特定Lockのクラスでは使用できない場合があります。< したがって、3 つの形式のロック取得すべてに対してまったく同じ保証またはセマンティクスを定義する実装は必要ありません。また、進行中のロック取得の中断をサポートする必要もありません。 各ロック メソッドによって提供されるセマンティクスと保証を明確に文書化するには、実装が必要です。 また、このインターフェイスで定義されている割り込みセマンティクスにも従う必要があります。ロック取得の中断は、完全にサポートされるか、メソッドエントリでのみサポートされます。

中断は一般にキャンセルを意味し、中断のチェックは頻繁に行われないため、実装では通常のメソッドの戻りよりも割り込みへの応答を優先できます。 これは、別のアクションがスレッドのブロックを解除した後に割り込みが発生したことを示すことができる場合でも当てはまります。 実装では、この動作を文書化する必要があります。

1\.5 で追加されました。

java.util.concurrent.locks.LockJava ドキュメント。

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

プロパティ

Handle

基になる Android オブジェクトの JNI 値を取得します。

(継承元 IJavaObject)
JniIdentityHashCode

ラップされたインスタンスの の java.lang.System.identityHashCode() 値を返します。

(継承元 IJavaPeerable)
JniManagedPeerState

マネージド ピアの状態。

(継承元 IJavaPeerable)
JniPeerMembers

メンバー アクセスと呼び出しのサポート。

(継承元 IJavaPeerable)
PeerReference

JniObjectReferenceラップされた Java オブジェクト インスタンスの を返します。

(継承元 IJavaPeerable)

メソッド

Disposed()

インスタンスが破棄されたときに呼び出されます。

(継承元 IJavaPeerable)
DisposeUnlessReferenced()

このインスタンスへの未処理の参照がない場合は、 を呼び出 Dispose()します。それ以外の場合は何も行いません。

(継承元 IJavaPeerable)
Finalized()

インスタンスが終了したときに呼び出されます。

(継承元 IJavaPeerable)
Lock()

ロックを取得します。

LockInterruptibly()

現在のスレッドが Thread#interrupt interrupted でない限り、ロックを取得します。

NewCondition()

このLockインスタンスにバインドされている新しいConditionインスタンスを返します。

SetJniIdentityHashCode(Int32)

によって返される値を JniIdentityHashCode設定します。

(継承元 IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

Lock 実装では、メソッドとステートメントを使用して synchronized 取得できるよりも広範なロック操作が提供されます。

(継承元 IJavaPeerable)
SetPeerReference(JniObjectReference)

によって返される値を PeerReference設定します。

(継承元 IJavaPeerable)
TryLock()

呼び出し時にロックが空きである場合にのみ、ロックを取得します。

TryLock(Int64, TimeUnit)

指定された待機時間内に空きがあり、現在のスレッドが Thread#割り込みが中断されていない場合にロックを取得します。

Unlock()

ロックを解放します。

UnregisterFromRuntime()

ランタイムが今後 Java.Interop.JniRuntime+JniValueManager.PeekValue の呼び出しから返されないように、このインスタンスの登録を解除します。

(継承元 IJavaPeerable)

拡張メソッド

JavaCast<TResult>(IJavaObject)

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

JavaCast<TResult>(IJavaObject)

Lock 実装では、メソッドとステートメントを使用して synchronized 取得できるよりも広範なロック操作が提供されます。

GetJniTypeName(IJavaPeerable)

Lock 実装では、メソッドとステートメントを使用して synchronized 取得できるよりも広範なロック操作が提供されます。

適用対象