AbstractQueuedLongSynchronizer — long 기반 동기화 상태의 AQS
AbstractQueuedLongSynchronizer — long 기반 동기화 상태의 AQS
AbstractQueuedLongSynchronizer는 동기화 상태가 long으로 유지되는 AbstractQueuedSynchronizer의 버전이에요. 이 클래스는 모든 상태 관련 파라미터와 결과가 int 대신 long으로 정의된다는 점을 제외하면 AbstractQueuedSynchronizer와 구조·속성·메서드가 완전히 같아요.
본문
이 클래스는 다단계 락(multilevel lock)이나 배리어처럼 64비트 상태가 필요한 동기화 장치를 만들 때 유용해요. 사용 방법과 예시는 AbstractQueuedSynchronizer를 참고해요.
상태 접근 메서드
protected final long getState() — 현재 동기화 상태 값을 반환해요. volatile 읽기의 메모리 의미론을 가져요.
protected final void setState(long newState) — 동기화 상태 값을 설정해요. volatile 쓰기의 메모리 의미론을 가져요.
protected final boolean compareAndSetState(long expect, long update) — 현재 상태 값이 예상 값과 같으면 주어진 값으로 (원자적으로) 설정해요. volatile 읽기·쓰기의 메모리 의미론을 가져요.
하위 클래스가 구현해야 하는 메서드
protected boolean tryAcquire(long arg) — 배타 모드에서 획득을 시도해요. 실패하면 acquire 메서드가 스레드를 큐에 넣고 다른 스레드의 release가 신호할 때까지 기다릴 수 있어요. Lock.tryLock() 구현에 쓸 수 있어요. 기본 구현은 UnsupportedOperationException을 던져요.
protected boolean tryRelease(long arg) — 배타 모드의 해제를 반영하도록 상태를 설정하려 시도해요. 완전히 해제된 상태가 되면 true를 반환해요.
protected long tryAcquireShared(long arg) — 공유 모드에서 획득을 시도해요. 실패 시 음수, 성공 시 0(이후 공유 획득 불가) 또는 양수(이후 공유 획득 가능)를 반환해요.
protected boolean tryReleaseShared(long arg) — 공유 모드의 해제를 반영하도록 상태를 설정하려 시도해요.
protected boolean isHeldExclusively() — 현재 스레드에 대해 동기화가 배타적으로 유지되는지 true를 반환해요. 조건(Condition)을 쓰지 않으면 정의할 필요가 없어요.
배타 모드 획득·해제 메서드
final void acquire(long arg) — 인터럽트를 무시하고 배타 모드로 획득해요. Lock.lock() 구현에 쓸 수 있어요.
final void acquireInterruptibly(long arg) throws InterruptedException — 인터럽트되면 중단하고 배타 모드로 획득해요. Lock.lockInterruptibly() 구현에 쓸 수 있어요.
final boolean tryAcquireNanos(long arg, long nanosTimeout) — 시간 초과가 지나면 실패하고, 인터럽트되면 중단하면서 배타 모드로 획득을 시도해요. Lock.tryLock(long, TimeUnit) 구현에 쓸 수 있어요.
final boolean release(long arg) — tryRelease가 true면 한 개 이상의 스레드를 블록 해제하며 배타 모드로 해제해요. Lock.unlock() 구현에 쓸 수 있어요.
공유 모드 획득·해제 메서드
final void acquireShared(long arg) — 인터럽트를 무시하고 공유 모드로 획득해요.
final void acquireSharedInterruptibly(long arg) — 인터럽트되면 중단하고 공유 모드로 획득해요.
final boolean tryAcquireSharedNanos(long arg, long nanosTimeout) — 시간 초과 시 실패, 인터럽트 시 중단하면서 공유 모드로 획득을 시도해요.
final boolean releaseShared(long arg) — tryReleaseShared가 true면 하나 이상의 스레드를 블록 해제하며 공유 모드로 해제해요.
큐 검사 메서드
final boolean hasQueuedThreads() — 획득을 기다리는 스레드가 있는지 조회해요.
final boolean hasContended() — 이 동기화 장치를 획득하려 경쟁한 스레드가 있었는지 조회해요. 상수 시간에 반환돼요.
final Thread getFirstQueuedThread() — 큐에서 첫(가장 오래 기다린) 스레드를 반환하거나, 큐가 비어 있으면 null을 반환해요.
final boolean isQueued(Thread thread) — 주어진 스레드가 현재 큐에 있는지 반환해요.
final boolean hasQueuedPredecessors() — 현재 스레드보다 오래 획득을 기다린 스레드가 있는지 조회해요. 공정 동기화 장치가 barging을 피하는 데 쓰여요.
final int getQueueLength() — 획득을 기다리는 스레드 수의 추정치를 반환해요.
final Collection<Thread> getQueuedThreads() / getExclusiveQueuedThreads() / getSharedQueuedThreads() — 큐에 있는 스레드 컬렉션을 반환해요.
Condition 지원 메서드
final boolean owns(ConditionObject condition) — 주어진 ConditionObject가 이 동기화 장치를 락으로 사용하는지 조회해요.
final boolean hasWaiters(ConditionObject condition) — 주어진 condition에서 기다리는 스레드가 있는지 조회해요.
final int getWaitQueueLength(ConditionObject condition) — 주어진 condition에서 기다리는 스레드 수의 추정치를 반환해요.
final Collection<Thread> getWaitingThreads(ConditionObject condition) — 주어진 condition에서 기다리는 스레드 컬렉션을 반환해요.
String toString() — 이 동기화 장치와 상태를 식별하는 문자열을 반환해요.
더 알아보기 (Learn more)
- AbstractQueuedSynchronizer 클래스 — 이 클래스의 int 기반 원본
- AbstractOwnableSynchronizer 클래스 — 기반 클래스
- Java 공식 API