이중 체크 잠금(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)를 퍼블릭으로 바꾸면 싱글톤을 다시 만들어 낼 수 있습니다.