이중 검사된 잠금은 동기화 비용을 줄이는 한편 스레드가 안전한 방식으로 요청 기반의 필드 초기화를 시도합니다.
안타깝지만 이 방식이 volatile
로 선언되지 않은 필드에서 사용될 경우 스레드 안전하지 않습니다.
Java 1.4 또는 이전 버전을 사용할 경우 이중 검사된 잠금은 volatile
필드에서도 작동하지 않습니다.
해당 문제와 관련한 자세한 설명은 위에 링크된 글을 참조하세요.
예:
class Foo {
private Helper helper = null
Helper getHelper() {
if (helper == null)
synchronized(this) {
if (helper == null) {
helper = new Helper()
}
}
}
return helper;
}
}