더북(TheBook)

이중 체크 잠금(Double-checked locking)도 아주 많이 쓰는 싱글톤 생성 방법입니다. 인스턴스 생성 여부를 싱글톤 클래스 잠금 전에 한 번, 객체를 생성하기 전에 한 번, 총 두 번 체크하니 비교적 안전한 장치라고 알려져 있습니다(코드 4-5).

코드 4-5 이중 체크 잠금

package com.devchronicles.singleton;

public class MySingleton {

private volatile MySingleton instance;

private MySingleton() {}

public MySingleton getInstance() {
    if (instance == null) { // 1
        synchronized (MySingleton.class) {
            if (instance == null) { // 2
                instance = new MySingleton();
            }
        }
    }
    return instance;
}
}

getInstance() 메서드는 프라이빗 인스턴스 MySingleton을 2회(주석 1에서 한 번, 주석 2에서 한 번) 널(null) 체크한 다음 MySingleton 인스턴스를 생성해서 할당합니다.

어떤 방법도 100% 안전하다고 장담할 순 없지요. 가령, 개발자가 자바 리플렉션(Reflection) API로 생성자 접근 수정자(access modifier)를 퍼블릭으로 바꾸면 싱글톤을 다시 만들어 낼 수 있습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.