StampedLock 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다.
[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의 상태는 버전 및 모드로 구성됩니다. 잠금 획득 메서드는 잠금 상태와 관련하여 액세스를 나타내고 제어하는 스탬프를 반환합니다. 이러한 메서드의 "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)가 없고 잠금을 사용할 수 있는 경우 유효한 쓰기 스탬프를 반환하여 모드를 "업그레이드"하려고 시도합니다. 이러한 메서드의 형태는 재시도 기반 디자인에서 발생하는 일부 코드 블로트를 줄이는 데 도움이 되도록 설계되었습니다.
StampedLocks는 스레드로부터 안전한 구성 요소 개발에 내부 유틸리티로 사용하도록 설계되었습니다. 해당 용도는 보호 중인 데이터, 개체 및 메서드의 내부 속성에 대한 지식에 의존합니다. 재진입하지 않으므로 잠긴 본문은 잠금을 다시 획득하려고 시도할 수 있는 다른 알 수 없는 메서드를 호출해서는 안 됩니다(사용하거나 변환할 수 있는 다른 메서드에 스탬프를 전달할 수 있음). 읽기 잠금 모드의 사용은 부작용이 없는 관련 코드 섹션에 의존합니다. 검증되지 않은 낙관적 읽기 섹션은 잠재적 불일치를 용인하는 것으로 알려져 있지 않은 메서드를 호출할 수 없습니다. 스탬프는 유한 표현을 사용하며 암호화적으로 안전하지 않습니다(예: 유효한 스탬프는 추측할 수 있음). 스탬프 값은 1년 연속 작업 후에 재활용될 수 있습니다. 이 기간보다 오랫동안 사용 또는 유효성 검사 없이 보관된 스탬프가 올바르게 유효성을 검사하지 못할 수 있습니다. StampedLocks는 직렬화할 수 있지만 항상 초기 잠금 해제 상태로 역직렬화되므로 원격 잠금에 유용하지 않습니다.
대부분의 java.util.concurrent.Semaphore Semaphore
구현과 달리 Lock
StampedLocks는 소유권에 대한 개념이 없습니다. 한 스레드에서 획득한 잠금을 다른 스레드에서 해제하거나 변환할 수 있습니다.
StampedLock의 예약 정책은 기록기보다 독자를 일관되게 선호하지 않으며 그 반대의 경우도 마찬가지입니다. 모든 "try" 메서드는 최선의 노력이며 일정 또는 공정성 정책을 반드시 준수하지는 않습니다. 잠금을 획득하거나 변환하기 위한 "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.util.concurrent.locks.StampedLock
Java 설명서
이 페이지의 일부는 Android 오픈 소스 프로젝트에서 만들고 공유하고 Creative Commons 2.5 특성 라이선스에 설명된 용어에 따라 사용되는 작업을 기반으로 하는 수정 사항입니다.
생성자
StampedLock() |
처음에는 잠금 해제된 상태로 새 잠금을 만듭니다. |
StampedLock(IntPtr, JniHandleOwnership) |
읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다. |
속성
Class |
이 |
Handle |
기본 Android 인스턴스에 대한 핸들입니다. (다음에서 상속됨 Object) |
IsReadLocked |
잠금이 현재 단독으로 보유되지 않은 경우 반환 |
IsWriteLocked |
잠금이 현재 단독으로 유지되는지를 반환 |
JniIdentityHashCode |
읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다. (다음에서 상속됨 Object) |
JniPeerMembers |
읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다. |
PeerReference |
읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다. (다음에서 상속됨 Object) |
ReadLockCount |
이 잠금에 대해 보유된 읽기 잠금 수를 쿼리합니다. |
ThresholdClass |
읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다. |
ThresholdType |
읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다. |
메서드
AsReadLock() |
메서드가 매핑 |
AsReadWriteLock() |
메서드가 |
AsWriteLock() |
메서드가 매핑 |
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() |
현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <알림을 받<>거나 <><중단/종료>합니다.> (다음에서 상속됨 Object) |
Wait(Int64, Int32) |
현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <>알림을 받<거나 <중단/>종료><>하거나 일정량의 실시간 경과가 발생할 때까지 대기합니다. (다음에서 상속됨 Object) |
Wait(Int64) |
현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <>알림을 받<거나 <중단/>종료><>하거나 일정량의 실시간 경과가 발생할 때까지 대기합니다. (다음에서 상속됨 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) |
읽기/쓰기 액세스를 제어하기 위한 세 가지 모드가 있는 기능 기반 잠금입니다. |