Share via


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 지원할 수 있습니다.

잠금은 여러 스레드에서 공유 리소스에 대한 액세스를 제어하는 도구입니다. 일반적으로 잠금은 공유 리소스에 대한 단독 액세스를 제공합니다. 한 번에 하나의 스레드만 잠금을 획득할 수 있으며 공유 리소스에 대한 모든 액세스 권한은 잠금을 먼저 획득해야 합니다. 그러나 일부 잠금은 의 ReadWriteLock읽기 잠금과 같은 공유 리소스에 대한 동시 액세스를 허용할 수 있습니다.

메서드 또는 문을 사용하면 synchronized 모든 개체와 연결된 암시적 모니터 잠금에 액세스할 수 있지만 모든 잠금 획득 및 해제가 블록 구조화된 방식으로 강제로 발생합니다. 여러 잠금을 획득할 때는 반대 순서로 해제되어야 하며 모든 잠금을 획득한 동일한 어휘 scope 해제해야 합니다.

메서드 및 문에 대한 synchronized 범위 지정 메커니즘을 사용하면 모니터 잠금으로 훨씬 쉽게 프로그래밍할 수 있으며 잠금과 관련된 많은 일반적인 프로그래밍 오류를 방지할 수 있지만 잠금을 보다 유연한 방식으로 작업해야 하는 경우가 있습니다. 예를 들어 동시에 액세스되는 데이터 구조를 트래버스하기 위한 일부 알고리즘에서는 &따옴표만 사용해야 합니다. 핸드 오버 핸드&따옴표; 또는 &따옴표; chain locking": 노드 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구현은 잠금을 획득하기 위한 비차단 시도(), 중단#lockInterruptibly될 수 있는 잠금 획득 시도(및 시간 초과#tryLock(long, TimeUnit)(#tryLock())할 수 있는 잠금 획득 시도를 제공하여 메서드 및 문 사용에 synchronized 대한 추가 기능을 제공합니다.

클래스는 Lock 보장된 순서 지정, 재진입하지 않는 사용 또는 교착 상태 검색과 같이 암시적 모니터 잠금과는 매우 다른 동작 및 의미 체계를 제공할 수도 있습니다. 구현에서 이러한 특수 의미 체계를 제공하는 경우 구현은 이러한 의미 체계를 문서화해야 합니다.

Lock 인스턴스는 일반 개체일 뿐이며 문에서 synchronized 대상으로 사용할 수 있습니다. instance 모니터 잠금을 Lock 획득하는 것은 해당 instance 메서드를 #lock 호출하는 것과 지정된 관계가 없습니다. 혼동을 방지하려면 자체 구현을 제외하고 이러한 방식으로 인스턴스를 사용하지 Lock 않는 것이 좋습니다.

언급된 경우를 제외하고 모든 매개 변수에 null 대한 값을 전달하면 이 NullPointerException throw됩니다.

<h2>메모리 동기화</h2>

모든 구현은 Java 언어 사양</인용>>: <ul><li>A 성공적인 lock 작업은 성공적인 <em>Lock</>em> 작업과 동일한 메모리 동기화 효과를 가짐에 따라 기본 제공 모니터 잠금에서 제공하는 것과 <동일한 메모리 동기화 의미 체계를 적용해야 합니다.<><Lock <li>A 성공적인 unlock 작업은 성공적인 <em>Unlock</em> 작업과 동일한 메모리 동기화 효과를 줍니다. </ul>

잠금 및 잠금 해제 작업에 실패하고 잠금/잠금 해제 작업을 다시 입력해도 메모리 동기화 효과가 필요하지 않습니다.

<h2>구현 고려 사항</h2>

세 가지 형태의 잠금 획득(인터럽트 가능, 비 인터럽트 가능 및 시간 제한)은 성능 특성, 순서 지정 보장 또는 기타 구현 품질에서 다를 수 있습니다. 또한 지정된 Lock 클래스에서는 잠금 획득을 <>중단<>하는 기능을 사용할 수 없습니다. 따라서 구현은 세 가지 형태의 잠금 획득 모두에 대해 정확히 동일한 보장 또는 의미 체계를 정의할 필요가 없으며 지속적인 잠금 획득 중단을 지원할 필요도 없습니다. 각 잠금 메서드에서 제공하는 의미 체계 및 보장을 명확하게 문서화하려면 구현이 필요합니다. 또한 잠금 획득 중단이 지원되는 범위까지 이 인터페이스에 정의된 중단 의미 체계를 준수해야 합니다. 이는 완전히 또는 메서드 항목에만 적용됩니다.

인터럽트는 일반적으로 취소를 의미하고 중단에 대한 검사는 드물기 때문에 구현은 정상적인 메서드 반환보다 인터럽트에 응답하는 것을 선호할 수 있습니다. 다른 작업으로 스레드의 차단을 해제한 후 인터럽트 발생이 표시될 수 있는 경우에도 마찬가지입니다. 구현에서는 이 동작을 문서화해야 합니다.

1.5에 추가되었습니다.

에 대한 Java 설명서입니다 java.util.concurrent.locks.Lock.

이 페이지의 일부는 만들고 공유하며 에 설명된 용어에 따라 사용되는 작업을 기반으로 수정됩니다.

속성

Handle

기본 Android 개체의 JNI 값을 가져옵니다.

(다음에서 상속됨 IJavaObject)
JniIdentityHashCode

java.lang.System.identityHashCode() 래핑된 instance 값을 반환합니다.

(다음에서 상속됨 IJavaPeerable)
JniManagedPeerState

관리되는 피어의 상태입니다.

(다음에서 상속됨 IJavaPeerable)
JniPeerMembers

멤버 액세스 및 호출 지원.

(다음에서 상속됨 IJavaPeerable)
PeerReference

JniObjectReference 래핑된 Java 개체 instance 의 를 반환합니다.

(다음에서 상속됨 IJavaPeerable)

메서드

Disposed()

instance 삭제되었을 때 호출됩니다.

(다음에서 상속됨 IJavaPeerable)
DisposeUnlessReferenced()

이 instance 대한 미해결 참조가 없으면 를 호출Dispose()합니다. 그렇지 않으면 아무 것도 수행하지 않습니다.

(다음에서 상속됨 IJavaPeerable)
Finalized()

instance 완료되면 호출됩니다.

(다음에서 상속됨 IJavaPeerable)
Lock()

잠금을 획득합니다.

LockInterruptibly()

현재 스레드가 Thread#인터럽트 중단되지 않는 한 잠금을 획득합니다.

NewCondition()

Lock instance 바인딩된 새 Condition instance 반환합니다.

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 호출에서 반환되지 않도록 이 instance 등록을 취소합니다.

(다음에서 상속됨 IJavaPeerable)

확장 메서드

JavaCast<TResult>(IJavaObject)

Android 런타임 확인 형식 변환을 수행합니다.

JavaCast<TResult>(IJavaObject)

Lock 구현은 메서드 및 문을 사용하여 synchronized 얻을 수 있는 것보다 더 광범위한 잠금 작업을 제공합니다.

GetJniTypeName(IJavaPeerable)

Lock 구현은 메서드 및 문을 사용하여 synchronized 얻을 수 있는 것보다 더 광범위한 잠금 작업을 제공합니다.

적용 대상