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 {
}
}