Back-end/JAVA

Lock - ReentrantLock

지나짱-* 2023. 1. 30. 20:27

ReentrantLock은 Java에서 제공하는 Lock 인터페이스의 구현체 중 하나이다.

 

ReentrantLock은 하나의 스레드에서 lock() 메소드를 호출하여 잠금을 획득할 수 있다.

이 때, lock() 메소드는 이미 잠금이 획득되어 있는 경우에도 호출할 수 있으며,

이 경우 호출한 스레드는 나중에 unlock() 메소드를 호출할 때까지 잠금이 풀리지 않는다.

 

ReentrantLock의 특징은 lock() 메소드에서 잠금을 획득할 수 없는 경우, 잠깐의 시간 동안 대기하다가 다시 시도할 수 있다는 점이다.

이를 구현하기 위해 tryLock() 메소드와 lockInterruptibly() 메소드를 제공한다.

 

ReentrantLock은 synchronized 키워드와 비교할 때 더 많은 기능을 제공하지만, 더 복잡한 구현이 필요하다는 단점이 있다.

 

import java.util.concurrent.locks.ReentrantLock;

public class Counter {
  private int count = 0;
  private ReentrantLock lock = new ReentrantLock();

  public void increment() {
    lock.lock();
    try {
      count++;
    } finally {
      lock.unlock();
    }
  }

  public int getCount() {
    lock.lock();
    try {
      return count;
    } finally {
      lock.unlock();
    }
  }
}

count 필드에 대한 접근을 조율하기 위해 ReentrantLock 사용하는 Counter 클래스이다.

increment 메서드는 count 증가시키기 전에 lock 획득하고, getCount 메서드는 count 반환하기 전에 lock 획득한다.

lock finally 블록에서 해제되어 예외가 발생하여도 항상 해제되도록 한.