레디스 기반 java용 Lock 객체이며 java.concurrent.Lock 인터페이스를 구현합니다.
Lock을 얻은 Redisson 인스턴스가 충돌나는 경우 데드락 상태에 빠질 수 있습니다. 이를 피하기 위해 Redisson은 lock을 얻은 Redisson 인스턴스가 살아있는 동안 lock timeout을 연장합니다. 기본적으로 lock timeout은 30초이며, Config.lockWatchdogTimeout을 통해 변경할 수 있습니다.
또한 Redisson은 lock을 얻은 상태에서 leaseTime 파라미터 시간을 지정할 수 있습니다. 지정된 시간이 지나면 lock은 자동을 해제됩니다.
RLock 객체는 Java Lock 사양에 따라 동작합니다. Lock을 얻은 쓰레드만 Lock을 해제할 수 있습니다. 다른 쓰레드에서 해제하려 하면 IllegalMonitorStateException 예외가 발생합니다.
RLock lock = redisson.getLock("myLock");
// 기본적인 락 방식
lock.lock();
// 또는 락 획득 후 10초 뒤 자동 락 해제
lock.lock(10, TimeUnit.SECONDS);
// 또는 100초간 락 대기 상태 기다림
// 락 획득 후 10초 뒤 자동 해제
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
if (res) {
try {
...
} finally {
lock.unlock();
}
}
// 비동기 예제
RLock lock = redisson.getLock("myLock");
RFuture<Void> lockFuture = lock.lockAsync();
// 학 획득 후 10초 뒤 락 자동 해제
RFuture<Void> lockFuture = lock.lockAsync(10, TimeUnit.SECONDS);
// 100초간 락 대기 상태 기다림
// 락 획득 후 10초 뒤 자동 해제
RFuture<Boolean> lockFuture = lock.tryLockAsync(100, 10, TimeUnit.SECONDS);
lockFuture.whenComplete((res, exception) -> {
// ...
lock.unlockAsync();
});
Fair Lock은 스레드가 요청한 것과 동일한 순서로 락 획득을 보장합니다. 모든 대기 스레드는 큐에 들어가고 일부 스레드가 죽으면 Redisson은 5초동안 반환을 기다립니다.
잠금을 흭득한 Redisson 인스턴스가 충돌하는 경우 데드락이 발생될 수 있습니다. 이를 피하기 위해 Redisson은 잠금 대기 상태 유지하기 위해 lock을 얻은 인스턴스가 살아있는 동안 timeout을 연장합니다. 기본적으로 잠금 대기 시간은 30초 이며, Config.lockWatchdogTimeout 설정을 통해 변경할 수 있습니다.
RLock lock = redisson.getFairLock("myLock");
// traditional lock method
lock.lock();
// or acquire lock and automatically unlock it after 10 seconds
lock.lock(10, TimeUnit.SECONDS);
// or wait for lock aquisition up to 100 seconds
// and automatically unlock it after 10 seconds
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
if (res) {
try {
...
} finally {
lock.unlock();
}
}
// 비동기 예제
RLock lock = redisson.getFairLock("myLock");
RFuture<Void> lockFuture = lock.lockAsync();
// or acquire lock and automatically unlock it after 10 seconds
RFuture<Void> lockFuture = lock.lockAsync(10, TimeUnit.SECONDS);
// or wait for lock aquisition up to 100 seconds
// and automatically unlock it after 10 seconds
RFuture<Boolean> lockFuture = lock.tryLockAsync(100, 10, TimeUnit.SECONDS);
lockFuture.whenComplete((res, exception) -> {
// ...
lock.unlockAsync();
});