言語

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>または >チェーン ロック>: ノード 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()、タイムアウト可能なロックの取得の試行 (#lockInterruptibly) を提供することで、#tryLock(long, TimeUnit)メソッドとステートメントの使用に関する追加機能が提供されます。

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

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

特に記載のない限り、パラメーターに null 値を渡すと、 NullPointerException がスローされます。

<h2>Memory Synchronization</h2>

すべてのLock実装<em>must</em>組み込みのモニター ロックによって提供されるのと同じメモリ同期セマンティクスが適用されます。 <サイトの第 17 章で説明されているように>Java言語仕様</cite>: <ul><li>成功したlock操作のメモリ同期効果は、成功した <em>Lock</em> アクションと同じです。 <li>成功した unlock 操作には、成功した <em>Unlock</em> アクションと同じメモリ同期効果があります。 </ul>

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

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

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

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

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

Javaドキュメント。

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

プロパティ

名前 説明
Handle

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

(継承元 IJavaObject)
JniIdentityHashCode

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

(継承元 IJavaPeerable)
JniManagedPeerState

マネージド ピアの状態。

(継承元 IJavaPeerable)
JniObjectReferenceControlBlock

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

(継承元 IJavaPeerable)
JniPeerMembers

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

(継承元 IJavaPeerable)
PeerReference

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

(継承元 IJavaPeerable)

メソッド

名前 説明
Disposed()

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

(継承元 IJavaPeerable)
DisposeUnlessReferenced()

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

(継承元 IJavaPeerable)
Finalized()

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

(継承元 IJavaPeerable)
Lock()

ロックを取得します。

LockInterruptibly()

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

NewCondition()

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

SetJniIdentityHashCode(Int32)

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

(継承元 IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

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

(継承元 IJavaPeerable)
SetPeerReference(JniObjectReference)

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

(継承元 IJavaPeerable)
TryLock()

呼び出し時にロックが解放された場合にのみロックを取得します。

TryLock(Int64, TimeUnit)

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

Unlock()

ロックを解放します。

UnregisterFromRuntime()

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

(継承元 IJavaPeerable)

拡張メソッド

名前 説明
GetJniTypeName(IJavaPeerable)

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

JavaAs<TResult>(IJavaPeerable)

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

JavaCast<TResult>(IJavaObject)

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

JavaCast<TResult>(IJavaObject)

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

TryJavaCast<TResult>(IJavaPeerable, TResult)

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

適用対象