Language \ Framework/Java

[JAVA] ReentrantLock, ReentrantReadWriteLock

구로모논 2025. 4. 14. 17:00

1. 개념

  • 동시성을 제어할 수 있는 객체.
  • synchronized 와 유사하나, 더 세밀한 제어와 확장된 기능을 제공함.

2. 차이점

  • ReentrantLock은 단일 잠금을 제공하고, ReentrantReadWriteLock의 경우는 읽기와 쓰기의 잠금을 별도로 관리할 수 있음.
  • ReentrantLock은 선택적으로 공정한 잠금정책을 제공할 수 있지만, ReentrantReadWriteLock은 지원하지 않음.
  • 읽기 작업이 많은 경우, ReentrantReadWriteLock이 더 나은 성능을 보여줌.

재진입의 의미!

  • ReentrantLock에서 '재진입’이란 이미 특정 스레드에 의해 잠금이 획득된 상태에서 같은 스레드가 다시 그 잠금을 획득하는 것을 의미.

3. ReentrantLock

ReentrantLock lock = new ReentrantLock();

// lock() -> 잠금
// unlock() -> 잠금 해제
// isLocked() -> 잠겼는지 확인
// tryLock() -> lock polling
// tryLock(long timeout, TimeUnit unit) throws InterruptedException -> lock polling 지정된 시간동안 lock 을 얻지 못한 경우 다시 작업을 시도할지 말지 결정 가능.

해당 객체는 lock을 수동으로 제어할 수 있다.
기본적으로 lock과 unlock으로 제어가 가능하고, tryLock을 통해 자동으로 lock을 얻을 수 있게 하는 함수도 존재한다.

해당 객체에 fair(boolean) 의 인자값을 true로 전달해주면, 가장 오래 기다린 쓰레드부터 lock을 얻을 수 있게 해준다.

synchronized 와의 차이점

차이점이 가장 중요한 부분이라고 할 수 있겠다.
synchronized는 어쨌든 감싸져 있는 부분이 완전히 실행되기 전까지는 lock이 풀리지 않는다.
하지만 ReentrantLock의 경우는 임계구역을 개발자가 직접 정의할 수 있기 때문에, 좀 더 효율적인 공동자원의 운영이 가능하다.

추가적으로, 잠금여부 확인이나 사용법에 따라서 공정한 잠금정책을 지원하고, 잠금획득을 시도하는 시간을 설정할 수도 있다.

4. ReentrantReadWriteLock

ReentrantLock의 기본적인 기능을 포함해서 Read, Write의 lock을 별도로 관리한다.

writeLock()은 쓰기 잠금, readLock()은 읽기 잠금이다.

조금 다른점은 writeLock의 경우는 unlock()을 실행해주지 않으면 다른 쓰레드가 작업을 실행하지 못한다.

하지만 readLock의 경우는 unlock()을 실행하지 않더라도, 다른 쓰레드가 읽기 작업을 수행할 수 있다.

반대로 readLock이 잠금을 획득한 경우, readLock이 해제되기 전까지 writeLock이 잠금을 획득하지 못한다.

따라서 읽기 작업에 한해서는 동시성을 높일 수 있다는 장점이 있다. → 성능 향상

여기서 중요한점!

읽기 작업에 한해서는 동시성을 높일 수 있다는게 장점이지만, 어쨌든 writeLock이 걸리면 read 작업은 실행하지 못한다.
그렇다면 이게 왜 장점일까?

ReentrantLock은 읽기와 쓰기의 구분이 없다.
일단 lock이 걸리면, 읽기든 뭐든 lock이 풀리기 전까지는 아무것도 하지 못한다.

하지만, ReentrantReadWriteLock은 쓰기 작업이 실행중인게 아니라면, 읽는 것에 한해서는 동시성을 가질 수 있다.
데이터의 변경이 없다면, 읽는 것에 한해서는 굳이 작업 스케쥴링에 있어서 줄을 세울 필요가 없다.
데이터가 변경되는 시점에만 그 누구도 접근하지 못하게 하고, 변경작업이 완료되면 누구나 해당 데이터를 읽게 해줌으로 인해서 ReentrantLock 보다 더 효율적인 자원 접근이 가능하다.

 

++ 그러나, 현재까지는 이런 기능이 사용되는 것은 아직까지 보지 못했다....

'Language \ Framework > Java' 카테고리의 다른 글

SOLID 원칙  (1) 2025.04.21
[JAVA] CompletableFuture  (0) 2025.04.14