'2015/09/22'에 해당되는 글 1건

  1. 2015.09.22 더블 체킹 락킹(Double Checking Locking)

싱글톤 패턴의 심화판

[클래스 생성과 동시에 초기화하기]

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
Posted by slender ankles
,