DESIGN PATTERN/실용주의 디자인패턴

Chaper 2 - Singleton Pattern

파란실버라이트 2012. 12. 19. 11:12

   모든 것이 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 실용주의 디자인패턴의 책 내용을 공부하며 정리한 내용입니다.

저자나 역자에게 문제를 일으킨다면 삭제하겠습니다.