DCL은 안티패턴이니 쓰지말자

public class DoubleCheckedLocking {
    private static Resource resource;
 
    public static Resource getInstance() {
        if (resource == null) {                                 // 1. 먼저 동기화 구문이 없는 상태로 초기화 작업이 필요한지 확인
            synchronized (DoubleCheckedLocking.class) {         // 2. 초기화 안되어 있다면(null이라면) 동기화 구문을 사용해 락을 걸고
                if (resource == null)                           // 3. 락을 걸고 다시 한번 초기화 되었는지 확인
                    resource = new Resource();                  // 4. 이렇게하면 한번에 하나의 스레드만 초기화 가능해짐
            }
        }
        return resource;                                        // 5. 그런데 이 부분은 동기화가 되어 있지 않아 stale 값을 볼 가능성이 있음. 즉, 참조된 내부 객체의 상태가 올바르지 않은 경우가 있을 수 있음
    }
 
    static class Resource {
 
    }
}