[java] 객체 락과 클래스 락의 차이점은?

객체 락은 인스턴스에 속하는 락입니다. 즉, 해당 객체가 인스턴스화될 때 생성되고, 해당 객체의 메서드가 호출될 때 자동으로 활성화됩니다. 객체 락은 한 번에 하나의 스레드만이 특정 객체의 락을 소유하고 사용할 수 있도록 합니다. 따라서 스레드는 객체 락을 획득하기 위해 경쟁하게 되고, 락을 획득한 스레드만이 해당 객체의 동기화된 메서드나 블록을 실행할 수 있습니다.

클래스 락은 클래스 레벨에서 사용되는 락입니다. 즉, 클래스의 정적 멤버(static) 또는 정적 블록(static block)에 사용됩니다. 클래스 락은 해당 클래스의 모든 인스턴스들이 공유하는 하나의 락입니다. 따라서 한 번에 하나의 스레드만이 클래스 락을 획득하여 사용할 수 있고, 클래스 락을 획득한 스레드만이 해당 클래스의 동기화된 메서드나 블록을 실행할 수 있습니다.

객체 락과 클래스 락의 가장 큰 차이점은 범위(scope)입니다. 객체 락은 해당 객체의 인스턴스에 대해 동기화를 제공하고, 클래스 락은 해당 클래스의 모든 인스턴스에 대해 동기화를 제공합니다.

크리티컬 섹션(critical section)이 여러 개의 객체 인스턴스에 걸쳐 있는 경우에는 객체 락을 사용하는 것이 적합하며, 그 외에는 클래스 락을 사용하는 것이 효율적입니다.

// 객체 락 사용 예시
public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }
}

// 클래스 락 사용 예시
public class Printer {
    public static synchronized void print(String message) {
        System.out.println(message);
    }
}

참고 문헌: