2012. 9. 19.

Singleton Pattren (싱글톤 패턴) - 디자인패턴

싱글톤 패턴

- 따로 이름도 모르고 사용해 왔던 녀석이 싱글톤패턴이구나...
  추가로 멀티 스레딩시의 문제점을 해결한 부분까지 추가.


public class SingletonPattren {
  /*
  * 클래스를 전역변수에 사용하게되면, 프로그램 실행 시 클래스를 로드하게됨.
  * 클래스의 크기가 클 경우  사용하지 않을 때에도 메모리를 소비함. gc도 될 수 없음.
  *
  *
  * Multi-threading에서 발생하는 문제 해결방법
  * 1.getInstance를 동기화시킴
  *   => 호출시마다 오버헤드 발생
  * 2.무조건 해당 클래스가 생긴다면 정적 초기화(선언부)시 생성
  * 3. DCL(Double-checking locking) 사용 - volatile with class synchronize
  *   => 처음 instance를 생성할 때에만 동기화를 하므로써
  *      getInstance()시 발생하는 오버헤드를 줄일 수 있음
  *
  * - 주의사항
  *  클래스 로더를 두개 이상 사용할 경우는 인스턴스가 여러개 생길 수 있음
  *    => 클래스 로더를 수동으로 지정하여 해결가능
  *  java 1.5 이후부터 제대로 동작(이전 컴파일러는 DCL을 정상적으로 체크하지 못함
  *    => 1.5 이하 버전이라면 2번의 방법을 사용하여 해결가능
  *  java 1.2이전 버전에서는 전역 reference가 없으면 메모리를 해제하는 문제가 있었음
  *    => 싱글턴 레지스트리 사용
  * 
  */

  private volatile static SingletonPattren m_oInstance;

  private SingletonPattren(){
  }

  public static SingletonPattren getInstance(){
    //Lazy instantiation - 게으른 인스턴스 생성
    if (m_oInstance == null)
    {
      synchronized (SingletonPattren.class) {
        //null check 필요
        if (m_oInstance == null)
          m_oInstance = new SingletonPattren();
      }
    }

    return m_oInstance;
  }
}


참고자료 : Head first design pattren - singleton pattren

댓글 없음:

댓글 쓰기

[다자녀할인] 2자녀 이상 모든 공항 주차장 50% 할인받기 (둘 중 한명은 15세 이하)

다자녀 기준이 2명으로 완화되면서 자녀가 2명만 되어도 공영주차장 50%(지역에 따라 30%인 곳 도 있음) 할인이 가능하고, 전국의 공항주차장도 50% 할인이 가능하다. "다둥이카드" 나 "경기 I Plus 카드"...