디자인 모드 - 단일 모드 (계속)

... 에 있다
4. 567915. 이 글 에서 단일 모델 에 대해 간단 한 소 개 를 했다. 그 다음 에 본 고 는 주로 여러 가지 모델, 다 중 스 레 드, 이중 검사 와 '불완전' 단일 사례 를 토론 했다.
다 중 모드
다 중 사례 모델 이란 실제 적 으로 단일 사례 모델 의 자연 홍보 이다. 단일 사례 유형 은 일반적인 상황 에서 하나의 사례 만 있 을 수 있 지만 단일 사례 유형 도 유한 한 사례 를 허용 할 수 있다. 이런 모델 은 바로 여러 가지 모델 이다. 그의 주요 특징 은 여러 가지 사례 가 있 을 수 있다 는 것 이다.
다 중 스 레 드
다음 코드 는 스 레 드 동기 화 를 사 용 했 습 니 다. 스 레 드 가 안전 하 다 고 할 수 있 습 니 다. 한 클래스 에 여러 개의 인 스 턴 스 가 나타 나 지 않 습 니 다.synchronized 동기 화가 없 으 면 단일 스 레 드 에 서 는 안전 하지만 다 중 스 레 드 에 서 는 여러 개의 인 스 턴 스 가 나타 날 수 있 습 니 다. 

public class LazySingleton        
{        
private LazySingleton m_instance;
private LazySingleton() { }       
  
//             ,              synchronized
synchronized public static LazySingleton getInstance()     
{        
   if (m_instance == null)        
   {        
       m_instance = new LazySingleton();        
   }        
   return m_instance;        
  }       
}

3. 이중 검사
위의 예 를 자세히 살 펴 보 니 동기 화 는 m 에 불과 하 다.인 스 턴 스 가 생 성 되 기 전, 즉 이 방법 을 처음 실 행 했 을 때 성능 이 현저히 떨 어 졌 습 니 다.개선 할 수 있 는 두 가지 방법 이 있다. 하 나 는 굶 주 린 한식 단일 모델 이 고, 다른 하 나 는 이중 검사 다.아래 코드 와 같이:

public class LazySingleton        
{        
private LazySingleton m_instance;
private LazySingleton() { }       

public static LazySingleton getInstance()     
{        
   if (m_instance == null)//first cheak
   {
       synchronized(this)
       {
         if (m_instance == null)//second cheak
         {
            m_instance = new LazySingleton();
         }
       }        
   }        
   return m_instance;        
  }       
}

하지만 '자바 와 모드' 를 보고 나 서 야 안 된다 는 것 을 알 게 되 었 습 니 다. 좋 은 생각 이지 만!성립 되 지 않 는 기본 적 인 원인 은 자바 컴 파일 러 에서 Lazy Singleton 류 의 초기 화 와 minstance 변수 할당 순 서 는 예측 할 수 없습니다.한 스 레 드 가 동기 화 되 지 않 은 조건 에서 m 를 읽 으 면인 스 턴 스 가 이 대상 을 인용 하고 호출 하 는 방법 은 대상 의 초기 화 과정 이 완료 되 지 않 아 붕 괴 될 수 있 습 니 다.
그러나 최신 JSR 133 의 자바 메모리 모델 에 따 르 면 인용 형식 을 volatile 로 설명 하면 이중 검사 모드 가 작 동 할 수 있 습 니 다.다음 과 같다.

public class LazySingleton        
{        
  private volatile LazySingleton m_instance;//        volatile
  private LazySingleton() { }       

  public static LazySingleton getInstance()     
  {        
    if (m_instance == null)//first cheak
    { 
       synchronized(this)
       {
         if (m_instance == null)//second cheak
         {
            m_instance = new LazySingleton();
         }
       }        
    }        
    return m_instance;        
  }       
}

4. 불완전 사례 류
아래 코드 에서 보 듯 이 게으름뱅이 식 단일 사례 처럼 보이 지만 자세히 살 펴 보 니 구조 함수 가 숨 어 있 지 않 았 다.이것 이 바로 불완전 단 례 류 다.

public class LazySingleton 
{ 
  private static LazySingleton 
  m_instance = null; 
  /** 
  *       ,          
  */ 
  public LazySingleton() { } //  :   public
  /** 
  *        
  * @return   LazySingleton        
  */ 
  synchronized public static LazySingleton getInstance() 
  { 
    if (m_instance == null) 
    { 
      m_instance = new LazySingleton(); 
    } 
    return m_instance; 
  }
}

좋은 웹페이지 즐겨찾기