singleton 패턴 적용시에 메소드에 동기화를 하기는 싫고, 그렇다고 static field를 사용할 수 없을때 DCL(Double-checked locking)을 사용했었는데 이것도 문제가 있다고 합니다.
http://www.ibm.com/developerworks/kr/library/j-dcl.html
[3]에서 생성자 body가 실행되기 전에 not-null 상태로 될 수 있다고 합니다.
때문에 JDK 1.5 이상 부터는 instance 변수를 volatile 로 선언하여 unique instance 변수가 원자성을 유지하도록 하여 올바른 싱글턴 인스턴스의 초기화가 진행되도록 해야 합니다.
하지만 여전히 메소드 동기화 또는 static field 사용을 추천하네요.
# 참고링크
* Double-checked locking 과 Singleton 패턴
* 디자인 패턴으로 알아본 Double-checked lock(DCL)
* 다시보는 Singleton
http://www.ibm.com/developerworks/kr/library/j-dcl.html
public static Singleton getInstance()
{
if (instance == null)
{
synchronized(Singleton.class) { //1
if (instance == null) //2
instance = new Singleton(); //3
}
}
return instance;
}
|
[3]에서 생성자 body가 실행되기 전에 not-null 상태로 될 수 있다고 합니다.
때문에 JDK 1.5 이상 부터는 instance 변수를 volatile 로 선언하여 unique instance 변수가 원자성을 유지하도록 하여 올바른 싱글턴 인스턴스의 초기화가 진행되도록 해야 합니다.
하지만 여전히 메소드 동기화 또는 static field 사용을 추천하네요.
# 참고링크
* Double-checked locking 과 Singleton 패턴
* 디자인 패턴으로 알아본 Double-checked lock(DCL)
* 다시보는 Singleton





