Share via


StampedLock 클래스

정의

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.

[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
상속
StampedLock
특성
구현

설명

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다. StampedLock의 상태는 버전 및 모드로 구성됩니다. 잠금 획득 메서드는 잠금 상태와 관련하여 액세스를 나타내고 제어하는 스탬프를 반환합니다. 이러한 메서드의 "try" 버전은 액세스 획득 실패를 나타내기 위해 특수 값 0을 반환할 수 있습니다. 잠금 해제 및 변환 메서드는 스탬프를 인수로 사용해야 하며 잠금 상태와 일치하지 않으면 실패합니다. 세 가지 모드는 다음과 같습니다.

<ul>

<li><b>Writing.</b> 메서드는 #writeLock 단독 액세스를 기다리는 것을 차단하여 메서드 #unlockWrite 에서 잠금을 해제하는 데 사용할 수 있는 스탬프를 반환할 수 있습니다. 의 시간이 초과되고 시간이 초과된 버전 tryWriteLock 도 제공됩니다. 잠금이 쓰기 모드로 유지되면 읽기 잠금을 가져올 수 없으며 모든 낙관적 읽기 유효성 검사가 실패합니다.

<li><b>Reading.</b> 메서드는 #readLock 비독점 액세스를 기다리는 것을 차단하여 메서드 #unlockRead 에서 잠금을 해제하는 데 사용할 수 있는 스탬프를 반환할 수 있습니다. 의 시간이 초과되고 시간이 초과된 버전 tryReadLock 도 제공됩니다.

<li><b>낙관적 읽기.</b> 메서드는 #tryOptimisticRead 잠금이 현재 쓰기 모드로 유지되지 않은 경우에만 0이 아닌 스탬프를 반환합니다. 메서드 #validate 는 지정된 스탬프를 가져온 이후 쓰기 모드에서 잠금을 획득하지 않은 경우 true를 반환합니다. 이 경우 가장 최근의 쓰기 잠금 릴리스 이전의 모든 작업은 에 대한 호출 tryOptimisticRead후 작업 전에 발생합니다. 이 모드는 읽기 잠금의 매우 약한 버전으로 간주될 수 있으며, 이는 언제든지 기록기에 의해 손상될 수 있습니다. 짧은 읽기 전용 코드 세그먼트에 낙관적 읽기 모드를 사용하면 경합이 줄어들고 처리량이 향상되는 경우가 많습니다. 그러나, 그것의 사용은 본질적으로 깨지기 쉬운. 낙관적 읽기 섹션은 필드만 읽고 유효성 검사 후 나중에 사용할 수 있도록 지역 변수에 보관해야 합니다. 낙관적 읽기 모드에서 읽은 필드는 크게 일치하지 않을 수 있으므로 일관성을 검사 및/또는 반복적으로 메서드를 호출하기 위해 데이터 표현을 잘 알고 있는 경우에만 사용이 validate()적용됩니다. 예를 들어 이러한 단계는 일반적으로 개체 또는 배열 참조를 먼저 읽은 다음 해당 필드, 요소 또는 메서드 중 하나에 액세스할 때 필요합니다.

</ul>

이 클래스는 세 가지 모드에서 변환을 조건부로 제공하는 메서드도 지원합니다. 예를 들어 메서드 #tryConvertToWriteLock 는 모드를 "업그레이드"하여 (1) 이미 쓰기 모드(2) 읽기 모드에 있고 다른 판독기 또는 (3) 낙관적 읽기 모드가 없고 잠금을 사용할 수 있는 경우 유효한 쓰기 스탬프를 반환합니다. 이러한 메서드의 형태는 재시도 기반 디자인에서 발생하는 일부 코드 bloat을 줄이는 데 도움이 되도록 설계되었습니다.

StampedLocks는 스레드로부터 안전한 구성 요소 개발에 내부 유틸리티로 사용하도록 설계되었습니다. 해당 용도는 보호하는 데이터, 개체 및 메서드의 내부 속성에 대한 지식에 의존합니다. 재진입하지 않으므로 잠긴 본문은 잠금을 다시 획득하려고 시도할 수 있는 다른 알 수 없는 메서드를 호출해서는 안 됩니다(사용하거나 변환할 수 있는 다른 메서드에 스탬프를 전달할 수 있음). 읽기 잠금 모드의 사용은 연결된 코드 섹션이 부작용이 없는 것에 의존합니다. 유효성이 검사되지 않은 낙관적 읽기 섹션은 잠재적 불일치를 허용할 수 없는 메서드를 호출할 수 없습니다. 스탬프는 유한한 표현을 사용하며 암호화적으로 안전하지 않습니다(즉, 유효한 스탬프를 추측할 수 있음). 스탬프 값은 1년 연속 작업 후에 재활용할 수 있습니다. 이 기간보다 오랫동안 사용 또는 유효성 검사 없이 보관된 스탬프가 올바르게 유효성을 검사하지 못할 수 있습니다. StampedLocks는 직렬화할 수 있지만 항상 초기 잠금 해제 상태로 역직렬화되므로 원격 잠금에 유용하지 않습니다.

와 비슷하 java.util.concurrent.Semaphore Semaphore지만 대부분의 Lock 구현과 달리 StampedLocks에는 소유권 개념이 없습니다. 한 스레드에서 획득한 잠금을 다른 스레드에서 해제하거나 변환할 수 있습니다.

StampedLock의 예약 정책은 기록기보다 독자를 일관되게 선호하지 않거나 그 반대의 경우도 마찬가지입니다. 모든 "시도" 방법은 최선의 노력이며 반드시 일정 또는 공정성 정책을 준수하지는 않습니다. 잠금을 획득하거나 변환하기 위한 "try" 메서드의 반환이 0이면 잠금 상태에 대한 정보가 전달되지 않습니다. 후속 호출이 성공할 수 있습니다.

여러 잠금 모드에서 조정된 사용을 지원하므로 이 클래스는 또는 ReadWriteLock 인터페이스를 Lock 직접 구현하지 않습니다. 그러나 연결된 기능 집합만 필요한 애플리케이션에서 StampedLock을 볼 #asReadLock()#asWriteLock()#asReadWriteLock() 수 있습니다.

<b>메모리 동기화.</b> 모든 모드에서 성공적으로 잠글 효과가 있는 메서드는 Java 언어 사양</인용>의 17<>장에 설명된 대로 em>Lock</em> 작업과 동일한 메모리 동기화 효과를 <갖습니다. 쓰기 모드에서 성공적으로 잠금 해제하는 메서드는 em Unlock/em 작업과 <동일한 메모리 동기화 효과를 갖습니다>.<> 낙관적 읽기 사용에서 가장 최근의 쓰기 모드 잠금 해제 작업 이전의 작업은 나중에 유효성 검사에서 true를 반환하는 경우에만 tryOptimisticRead를 따르는 작업 전에 수행되도록 보장됩니다. 그렇지 않으면 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.

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

생성자

StampedLock()

처음에 잠금 해제된 상태로 새 잠금을 만듭니다.

StampedLock(IntPtr, JniHandleOwnership)

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.

속성

Class

Object의 런타임 클래스를 반환합니다.

(다음에서 상속됨 Object)
Handle

기본 Android instance 대한 핸들입니다.

(다음에서 상속됨 Object)
IsReadLocked

잠금이 현재 비독점적으로 유지되는 경우 를 반환 true 합니다.

IsWriteLocked

잠금이 현재 독점적으로 유지되는 경우 를 반환 true 합니다.

JniIdentityHashCode

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.

(다음에서 상속됨 Object)
JniPeerMembers

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.

PeerReference

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.

(다음에서 상속됨 Object)
ReadLockCount

이 잠금에 대해 보유된 읽기 잠금 수를 쿼리합니다.

ThresholdClass

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.

ThresholdType

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.

메서드

AsReadLock()

메서드가 에 매핑#readLock되는 Lock#lock 이 StampedLock의 일반 Lock 뷰를 반환하고 다른 메서드에 에도 유사하게 반환합니다.

AsReadWriteLock()

메서드가 ReadWriteLock , 및 에 매핑되는 ReadWriteLock#readLock() 이 StampedLock의 뷰를 #asReadLock()반환합니다 ReadWriteLock#writeLock()#asWriteLock().

AsWriteLock()

메서드가 에 매핑#writeLock되는 Lock#lock 이 StampedLock의 일반 Lock 뷰를 반환하고 다른 메서드에 에도 유사하게 반환합니다.

Clone()

이 개체의 복사본을 만들고 반환합니다.

(다음에서 상속됨 Object)
Dispose()

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.

(다음에서 상속됨 Object)
Dispose(Boolean)

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.

(다음에서 상속됨 Object)
Equals(Object)

다른 개체가 이 개체와 "같음"인지 여부를 나타냅니다.

(다음에서 상속됨 Object)
GetHashCode()

개체의 해시 코드 값을 반환합니다.

(다음에서 상속됨 Object)
IsLockStamp(Int64)

스탬프가 잠금을 보유하는 것을 나타내는지 여부를 알려줍니다.

IsOptimisticReadStamp(Int64)

스탬프가 성공적인 낙관적 읽기를 나타내는지 여부를 알려줍니다.

IsReadLockStamp(Int64)

스탬프가 잠금을 단독으로 보유하는 것을 나타내는지 여부를 알려줍니다.

IsWriteLockStamp(Int64)

스탬프가 잠금을 단독으로 보유하는 것을 나타내는지 여부를 알려줍니다.

JavaFinalize()

가비지 수집에서 개체에 대한 참조가 더 이상 없다고 판단할 때 개체의 가비지 수집기에서 호출됩니다.

(다음에서 상속됨 Object)
Notify()

이 개체의 모니터에서 대기 중인 단일 스레드를 해제합니다.

(다음에서 상속됨 Object)
NotifyAll()

이 개체의 모니터에서 대기 중인 모든 스레드를 해제합니다.

(다음에서 상속됨 Object)
ReadLock()

비독점적으로 잠금을 획득하여 필요한 경우 사용 가능할 때까지 차단합니다.

ReadLockInterruptibly()

비독점적으로 잠금을 획득하여 필요한 경우 사용 가능하거나 현재 스레드가 중단될 때까지 차단합니다.

SetHandle(IntPtr, JniHandleOwnership)

Handle 속성을 설정합니다.

(다음에서 상속됨 Object)
ToArray<T>()

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.

(다음에서 상속됨 Object)
ToString()

개체의 문자열 표현을 반환합니다.

(다음에서 상속됨 Object)
TryConvertToOptimisticRead(Int64)

잠금 상태가 지정된 스탬프와 일치하면 스탬프가 잠금을 보유하는 것을 나타내는 경우 해당 스탬프를 해제하고 관찰 스탬프를 반환합니다.

TryConvertToReadLock(Int64)

잠금 상태가 지정된 스탬프와 일치하는 경우 원자적으로 다음 작업 중 하나를 수행합니다.

TryConvertToWriteLock(Int64)

잠금 상태가 지정된 스탬프와 일치하는 경우 원자적으로 다음 작업 중 하나를 수행합니다.

TryOptimisticRead()

나중에 유효성을 검사할 수 있는 스탬프를 반환하거나 단독으로 잠긴 경우 0을 반환합니다.

TryReadLock()

잠금을 즉시 사용할 수 있는 경우 비독점적으로 획득합니다.

TryReadLock(Int64, TimeUnit)

지정된 시간 내에 잠금을 사용할 수 있고 현재 스레드가 중단되지 않은 경우 비독점적으로 잠금을 획득합니다.

TryUnlockRead()

스탬프 값을 요구하지 않고 읽기 잠금이 유지되면 읽기 잠금의 한 보류를 해제합니다.

TryUnlockWrite()

스탬프 값을 요구하지 않고 쓰기 잠금이 유지되면 해제합니다.

TryWriteLock()

잠금을 즉시 사용할 수 있는 경우 단독으로 획득합니다.

TryWriteLock(Int64, TimeUnit)

지정된 시간 내에 사용할 수 있고 현재 스레드가 중단되지 않은 경우 잠금을 독점적으로 획득합니다.

Unlock(Int64)

잠금 상태가 지정된 스탬프와 일치하는 경우 는 잠금의 해당 모드를 해제합니다.

UnlockRead(Int64)

잠금 상태가 지정된 스탬프와 일치하면 비독점 잠금을 해제합니다.

UnlockWrite(Int64)

잠금 상태가 지정된 스탬프와 일치하는 경우 배타적 잠금을 해제합니다.

UnregisterFromRuntime()

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.

(다음에서 상속됨 Object)
Validate(Int64)

지정된 스탬프를 발급한 이후 잠금을 독점적으로 획득하지 않은 경우 true를 반환합니다.

Wait()

현재 스레드가 각성될 때까지 대기하도록 합니다. 일반적으로 <알림을<> 받>거나<<> 중단/em>합니다.

(다음에서 상속됨 Object)
Wait(Int64)

현재 스레드가 깨어날 때까지 대기하게 하며, 일반적으로 <알림을 받<>거나 중단</>em>>을 받거나 <일정량의 실시간이 경과할 때까지 대기합니다.

(다음에서 상속됨 Object)
Wait(Int64, Int32)

현재 스레드가 깨어날 때까지 대기하게 하며, 일반적으로 <알림을 받<>거나 중단</>em>>을 받거나 <일정량의 실시간이 경과할 때까지 대기합니다.

(다음에서 상속됨 Object)
WriteLock()

잠금을 단독으로 획득하여 필요한 경우 가용할 때까지 차단합니다.

WriteLockInterruptibly()

잠금을 단독으로 획득하여 필요한 경우 사용 가능하거나 현재 스레드가 중단될 때까지 차단합니다.

명시적 인터페이스 구현

IJavaPeerable.Disposed()

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.

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

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.

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

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.

(다음에서 상속됨 Object)
IJavaPeerable.JniManagedPeerState

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.

(다음에서 상속됨 Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.

(다음에서 상속됨 Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.

(다음에서 상속됨 Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.

(다음에서 상속됨 Object)

확장 메서드

JavaCast<TResult>(IJavaObject)

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

JavaCast<TResult>(IJavaObject)

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.

GetJniTypeName(IJavaPeerable)

읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.

적용 대상