싱글톤 패턴의 심화판
[클래스 생성과 동시에 초기화하기]
public class Singleton { private static Singleton singleton = new Singleton(); public static Singleton getInstance(){ return singleton; } private Singleton(){} } | cs |
흔히 많이 쓰는 싱글톤 구현방법이다. 하지만 싱글톤이 정작 필요로 할 때 생성되는 편이 낫지 않을까?
[클래스의 메서드가 호출 될 때 생성하기]
public class Singleton { private static Singleton singleton; public static synchronized Singleton getInstance(){ if(singleton == null){ singleton = new Singleton(); } return singleton; } private Singleton(){} } | cs |
좋은 코드라고 생각할 수 있겠다. 메소드 영역에 static 변수가 자리 잡는 시간은 최초 호출시라는 점을 잘 이용했다. 하지만 이 것은 좋지 않은 코드라고 한다. 매 getInstance()호출시마다 synchronized 동기화 문제로 비용을 치뤄야 하기 때문이다. 이러한 단점을 완화하기 위해 DCL이 고안되었다.
[더블 체크드 락킹(Double Checked Locking)]
DCL이 사용되는 궁극적인 이유는 늦은 초기화이다. 늦은 초기화가 필요한 때는 그럼 언제인가??
필드의 생성 비용(시간)이 큰 경우이거나, 필드의 값이 반드시 사용되지 않은 경우라고 한다. 뭐 이런 경우가 많지는 않다고 하는데...
public class Singleton { private volatile static Singleton singleton; public static Singleton getInstance(){ if(singleton == null){ synchronized (Singleton.class) { singleton = new Singleton(); } } return singleton; } private Singleton(){} } | cs |
스레드 안정성에 대한 문제!!
[싱글톤 홀더 패턴(Singleton Holder Pattern)]
'DesignPattern' 카테고리의 다른 글
싱글톤 패턴 - (Singleton Pattern) (0) | 2015.07.01 |
---|