싱글턴 패턴

Program/Info Etc 2008. 1. 16. 09:54
[Design Patterns] 싱글턴패턴(Singleton Pattern) Design Patterns
출처 :
2007/05/10 13:25

http://blog.naver.com/jsharp83/110017404424

예전에 쓰레드풀을 만들 때, 싱글턴 패턴을 썼었는데, 그 당시에는 역시 아무것도 모르던 시절이라, 그냥 시키는데로 그냥 그렇게 만들었었다. 왜 그렇게 만들어야 되는지도 모르고,

싱글턴패턴 - 싱글턴 패턴은 해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴이다.

싱글턴 패턴은 스레드 풀이라던가, 캐시, 대화상자, 사용자설정, 디바이스드라이버 등등 객체가 전체프로그램에서 오직 하나만 생성되어야 하는 경우에 사용한다.

그럼 전역변수로 static 으로 선언해서 사용하면 되지 않느냐... 라는 생각을 가질 수가 있는데, 이런식으로 객체를 생성하면 프로그램이 실행 될 때 이미 그 변수가 메모리에 자리잡고 있게된다. 사용도 되기전에, 만약 이 변수가 안사용된다면(그럴리는 거의 없겠지만;) 그만큼 낭비가 되는것.

싱글턴 패턴은 필요한 때 오직 하나의 객체만을 만들어서, 그것이 다시 필요한 시점에서는 전에 만들었던 객체를 리턴해준다.

public class Singleton {

private static Singleton uniqueInstance;

private Singleton()

public static Singleton getInstance()

{

if(uniqueInstance==null)

uniqueInstance = new Singleton();

return uniqueInstance;

}

}

위의 코드에서 보는 것과 같이, 오직 하나의 객체를 만들어 주기 위해 생성자를 private 으로 두고, 객체를 얻기위해선 getInstance() 함수를 호출한다.

하지만 위의 코드는 두 개의 쓰래드가 객체를 얻으려는 상황에서 먼저온 if(uniqueInstance==null)를 실행하고 Context Switching이 일어나서 두 번째 객체도 if 문을 실행하게 된다면, 결국 두 개의 객체가 생성되게 되고, 프로그램에 문제가 생기게 될것이다. 이것을 방지하기 위한 방법으론 그냥 static 메소드로 선언하여 클래스가 로딩될 때 객체를 생성해 주는 방법과, getInstance() 메소드를 synchronized 시켜주면 된다.

하지만 메소드 전체를 synchronized 시켜주는 것이 부담이 된다면 DCL(Double-checking Locking) 이라는 방법이 있다.

public class Singleton {

private volatile static Singleton uniqueInstance;

private Singleton(){}

public static Singleton getInstance()

{

if(uniqueInstance==null)

synchronized (Singleton.class)

{

if(uniqueInstance==null)

{

uniqueInstance = new Singleton();

}

}

return uniqueInstance;

}

}

소스에서 보는것처럼 uniqueInstance 가 NULL 인지를 두 번 체크하는것이다.

이렇게 체크를 한다면 처음 객체가 만들어질 때를 제외하고는 synchronized 부분에 걸리는 일이 없을 것이다.

하지만 volatile 키워드는 자바 1.4 이전 버전에서는 잘 동기화가 안된다고 한다.

또한 자바 1.2 이전의 버전에서는 가비지컬렉터가 싱글턴으로 선언된 객체를 중간에 날려먹기도 한단다.

'Program > Info Etc' 카테고리의 다른 글

SVN 설치/ 사용법  (0) 2008.01.22
MD5 암호화  (0) 2008.01.16
XML 간단한 설명  (0) 2008.01.16
: