는 Wikipedia에 나와있는 자바 싱글 톤 구현 중 하나가 :Java에서 Double Checking Locking Singleton을 사용하는 것이 안전합니까?
는public class SingletonDemo {
private static volatile SingletonDemo instance = null;
private SingletonDemo() {
}
public static SingletonDemo getInstance() {
if (instance == null) {
synchronized (SingletonDemo.class) {
if (instance == null) {
instance = new SingletonDemo();
}
}
}
return instance;
}
}
객체가 완전히 때 생성자 완료를 초기화 할 것으로 간주됩니다
한다는 Java Language Specification 17, paragraph 5있다. 객체가 완전히 초기화 된 후에 객체에 대한 참조 만 볼 수있는 스레드는 해당 객체의 최종 필드에 대해 올바르게 초기화 된 값을 볼 수 있습니다.
좋아, 그럼 우리의 SingletonDemo 클래스가 아닌 최종 필드가 있다고 상상해보십시오. 따라서 동시 스레드는 생성자에 지정된 올바른 값 대신 기본값을 읽을 수 있습니까?
"이중 검사 잠금을 사용하지 마십시오"라는 이중 검사 잠금에 대한 대답이 아닙니까? 작동하지 않거나 도움이되지 않습니다. – user2357112
@ user2357112 사실이지만 흥미로운 질문입니다. 어쨌든 대답해야한다고 생각합니다. – Navin
아니요, DCL은 종종 실제로 유용합니다. 단지주의해야합니다. 어쨌든 많은 소스에 나열된 일반적인 예입니다.그래서 저는 그것이 정말로 안전한지를 결정하기를 원합니다. Singleton 또는 DCL에 관한 것이 아니라 Java 메모리 모델 및 스레딩 모델에 관한 것입니다. –