Lock을 이용한 동기화는 synchronized 키워드를 사용하는 전통적인 방법 대신 명시적인 락을 사용하여 동기화를 달성하는 방법입니다. Lock 인터페이스를 구현한 클래스 중 하나인 ReentrantLock을 사용하는 것이 일반적입니다.
아래는 Lock을 이용한 동기화의 예제입니다.
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Example {
private final Lock lock = new ReentrantLock();
private int sharedVariable = 0;
public void incrementSharedVariable() {
lock.lock(); // 락 획득
try {
sharedVariable++;
System.out.println(Thread.currentThread().getName() + ": Shared variable incremented to " + sharedVariable);
} finally {
lock.unlock(); // 락 해제
}
}
}
위의 코드에서 lock.lock()은 락을 획득하고, lock.unlock()은 락을 해제합니다. 이러한 명시적인 락 사용은 락의 획득과 해제를 더 자세히 제어할 수 있게 해줍니다.
이러한 방식의 장점은 다음과 같습니다.
1. 재진입이 가능한 락(Reentrant) : 동일한 쓰레드가 이미 획득한 락을 다시 획득할 수 있습니다. 이는 일부 상황에서 유용할 수 있습니다.
2. 공정성 설정 가능 : ReentrantLock은 생성자에서 공정성 여부를 설정할 수 있습니다. 공정한 락은 대기 중인 쓰레드 중에서 가장 오랫동안 대기한 쓰레드에게 락을 부여하는 방식으로 동작합니다.
3. 조건 변수(Condition) 지원 : ReentrantLock은 Condition 객체를 생성하여 여러 쓰레드 간의 통신을 가능하게 합니다.
4. 인터럽트 지원 : lockInterruptibly() 메서드를 사용하면 인터럽트에 의해 블록된 쓰레드를 깨우는 것이 가능합니다.
5. 효율적인 튜닝 가능 : synchronized는 내부적으로 잠금의 효율성을 높이기 위해 JVM이 최적화를 수행하지만, Lock을 사용하면 특정한 상황에 맞게 성능 튜닝이 가능합니다.
ReentrantLock의 사용은 주의가 필요하며, 특히 lock()과 unlock()은 반드시 try-finally 블록 내에서 사용하여 락의 안전한 해제를 보장해야 합니다.
With ChatGPT
'JAVA > 포스팅' 카테고리의 다른 글
자바 쓰레드 volatile (0) | 2023.11.22 |
---|---|
자바 쓰레드 Condition을 이용한 동기화 (0) | 2023.11.22 |
자바 쓰레드 Lock (0) | 2023.11.22 |
자바 쓰레드 notify() (0) | 2023.11.22 |
자바 쓰레드 wait() (0) | 2023.11.22 |