ReentrantLock은 Java에서 제공하는 동기화를 위한 클래스 중 하나로, 명시적인 락(또는 잠금)을 제공하여 다중 스레드 환경에서 안전하게 공유 자원에 접근할 수 있도록 도와주는 도구입니다.
"Reentrant"는 재진입을 의미하며, 스레드가 이미 획득한 잠금을 여러 번 다시 획득할 수 있다는 것을 나타냅니다. 이는 재진입이 가능하다는 특징을 가지고 있습니다.
ReentrantLock은 Lock 인터페이스를 구현하고 있으며, 기존의 synchronized 키워드보다 더 많은 기능을 제공합니다. 몇 가지 주요 특징은 다음과 같습니다:
- 재진입 가능(Reentrant): 스레드가 이미 획득한 락을 여러 번 재진입할 수 있습니다.
- 공정성 설정 가능: ReentrantLock은 생성자에게 공정성 여부를 설정할 수 있는 옵션을 제공합니다. 공정한 락을 사용하면 더 오래 기다린 스레드가 우선적으로 락을 획득합니다.
- 인터럽트 가능한 락: 락을 기다리는 동안 스레드를 인터럽트할 수 있습니다.
- 조건 변수(Condition): ReentrantLock과 함께 사용되는 조건 변수를 제공하여 스레드 간의 통신을 더 세밀하게 제어할 수 있습니다.
ReentrantLock을 사용하려면 락을 획득하고 해제하는 부분을 lock() 및 unlock() 메서드로 감싸면 됩니다. 예시 코드는 다음과 같습니다:
import java.util.concurrent.locks.ReentrantLock;
public class Example {
private final ReentrantLock lock = new ReentrantLock();
public void performTask() {
lock.lock(); // 락 획득
try {
// 공유 자원에 대한 작업 수행
} finally {
lock.unlock(); // 락 해제
}
}
}
ReentrantLock은 tryLock() 메서드를 통해 락을 시도하고 성공 여부를 반환할 수도 있습니다. 이를 통해 타임아웃 등을 설정할 수 있습니다.