모든 것이 Static 인 Singleton 실체와 방식은 간편하지만 컴파일 시에 모든 정보를 알 수 없거나
오버라이딩 가능한 메소드가 없으므로 상속을 통한 커스터마이징이 필요한 경우에는 사용할 수 없다
=> GoF 식 Singleton 실체화가 필요
class Singleton
{
private static Singleton instance = null;
public static instance()
{
if( instance == null )
{
instance = new Singleton();
}
return instance;
}
//...
}
1.쓰레딩 이슈
접근 동기화가 가장 많은 문제를 일으킨다.
1. instance() 메소드를 동기화시켜 해결 : synchronized 키워드를 사용
=> singleton을 접근할 때마다 동기화로 인한 오버헤드를 감수
2. Static 초기화를 사용
class Singleton2
{
private static Singleton instance = new Singleton();
public instance()
{
return instance;
}
}
2-1 . Static 초기화를 사용하지 못하는 유일한 경우 : 객체 생성에 필요한 정보를 런타임에 인자를 통해 받아야 할 경우
=> Gof식 실체화를 하고 Synchronized 키워드를 통해 메소드를 동기화
public static void main( String[] args )
{ //...
Connection.pointTo( new URL(args[i]) ); //런타임에 인자를 가지고 URL을 생성
//...
}
class Connection
{
private static URL server;
public static pointAt( URL server ){ this.server = server; }
private Connection()
{ //...
establishConnectionTo( server );
//...
}
private static Connection instance;
public synchronized static Connection instance()
{
if( instance == null )
instance = new Connection();
return connection();
}
}
2. Double-Checked Locking(Don't use)
: JVM 1.5 이전 버전에서는 제대로 작동하지 않는다.
class DoubleChecked
{
private static volatile DoubleChecked instance = null;
private static Object lock = new Object();
public static DoubleChecked instance()
{
if( instance == null)
synchronized( lock )
{
if( instance == null )
instance = new DoubleChecked();
}
return instance;
}
}
3. Singleton 죽이기
: Runtime.addShutdonwHook()을 사용 : 자바에서만 사용가능하므로 자세하게 정리하지 않겠다.
Holub on 실용주의 디자인패턴의 책 내용을 공부하며 정리한 내용입니다.
저자나 역자에게 문제를 일으킨다면 삭제하겠습니다.