티스토리 뷰

고전적인 싱글턴 패턴 구현법

public class Singleton{
private static Singleton single;
private Singleton(){}

public static Singleton getInstance(){
if(single == null)
single = new Singleton();

return single;
}
//기타메소드
} 



위의 고전적인 싱글턴 패턴에는 멀티스레드 환경에서 생성문제가 있다.

가능성은 적겠지만, 스레드환경에 따라 싱글턴으로 만든 객체를 생성할 때 2개이상의 객체가 생성될 수 있다.


*멀티스레딩 문제 해결방법*


1. getInstance()의 동기화

public class Singleton{
private static Singleton single;
private Singleton(){}

public static synchronized Singleton getInstance(){
if(single == null)
single = new Singleton();

return single;
}
//기타메소드
}



동기화로 처리하면 멀티스레딩 문제를 해결할 수 있다. 하지만 동기화가 필요한 시점은 객체의 생성시기뿐이라, 동기화상태를 유지할 필요가 없다. 생성과정 이외의 동기화는 불필요한 오버헤드만 증가시킨다. (메소드를 동기화하면 성능이 100배 정도 저하된다고 한다.)


2. DCL(Double Checking Locking)을 사용한 동기화 

public class Singleton{
private volatile static Singleton single;
private Singleton(){}

public static Singleton getInstance(){
if(single == null){
synchronized (Singleton.class){
single = new Singleton();
}
}

return single;
}
//기타메소드
}



객체를 생성 할 경우에만 동기화 처리한다.


3. 처음부터 만들어버리기 

public class Singleton{
private static final Singleton single = new Singleton();
private Singleton(){}

public static Singleton getInstance(){
return single;
}
//기타메소드
}



4.내부클래스의 사용(권장)

public class Singleton{
…
private static class SingleHoler{
private static final Singleton single = new Singleton();
}

public static Singleton getInstance(){
return SingleHoler.single ;
}
…
}



5. 최근에 권장되는 스타일

public enum Singleton{
single;
…
}









'Paradigm > OOP' 카테고리의 다른 글

[OOP] AdapterPattern  (0) 2013.05.10
[OOP] 초기화를 위한 Null Object  (0) 2013.04.27
[OOP] CommandPattern 구현해보기  (0) 2013.04.27
[OOP] Singleton, Doubleton, Mutilton  (0) 2013.04.19
[OOP] Observable의 단점  (0) 2013.04.19
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday