자바 의 이중 검사 (Double - Check) 상세 설명

2767 단어
Effecitve Java 라 는 책의 제4 8 조 에서 이중 검사 모델 을 언급 했 고 이런 모델 은 자바 에 서 는 일반적으로 적용 되 지 않 는 다 고 지적 했다.이 모델 의 구 조 는 다음 과 같다.

public Resource getResource() { 
 if (resource == null) {  
  synchronized(this){  
   if (resource==null) { 
    resource = new Resource();  
   }   
  }  
 } 
 return resource; 
}

 이 모드 는 다음 코드 개선 입 니 다:

public synchronized Resource getResource(){ 
 if (resource == null){  
    resource = new Resource();  
 } 
 return resource; 
} 

이 코드 의 목적 은 resource 지연 초기 화 입 니 다.하지만 방문 할 때마다 동기 화가 필요 하 다.동기 화 비용 을 줄 이기 위해 이중 검사 모드 가 생 겼 다.
자바 에서 이중 검사 모드 가 올 바 르 지 않 은 이 유 는 동기 화 되 지 않 은 상태 에서 참조 형식 이 스 레 드 가 안전 하지 않 기 때 문 입 니 다.롱 과 더 블 의 기본 유형 을 제외 하고 이중 검사 모드 가 적 용 됩 니 다.예 를 들 어 아래 의 이 코드 는 정확 하 다.

private int count; 
public int getCount(){ 
 if (count == 0){  
  synchronized(this){  
   if (count == 0){ 
    count = computeCount(); //        
   }   
  }  
 } 
 return count; 
} 


 위 는 자바 의 이중 검사 모드 (double - check idiom) 에 대한 일반적인 결론 이다.그러나 일 은 아직 끝나 지 않 았 습 니 다. 자바 의 메모리 모드 도 개선 되 고 있 기 때 문 입 니 다.Doug Lea 는 그의 글 에서 "최신 JSR 133 의 자바 메모리 모델 에 따라 인용 형식 을 volatile 로 설명 하면 이중 검사 모드 가 작 동 할 수 있 습 니 다" 라 고 썼 다.따라서 앞으로 자바 에서 이중 검사 모드 를 사용 하려 면 아래 코드 를 사용 할 수 있 습 니 다.

private volatile Resource resource; 
public Resource getResource(){ 
 if (resource == null){  
  synchronized(this){  
   if (resource==null){ 
    resource = new Resource();  
   }   
  }  
 } 
 return resource; 
} 


 그럼요. JSR 133 규범 을 따 르 는 자바 에서.
따라서 double - check 은 J2SE 1.4 또는 초기 버 전이 다 중 스 레 드 나 JVM 에서 조정 할 때 out - of - order writes 로 인해 사용 할 수 없습니다.이 문 제 는 J2SE 5.0 에서 복구 되 었 으 며, volatile 키 워드 를 사용 하여 다 중 스 레 드 의 단일 예 를 확보 할 수 있 습 니 다.

public class Singleton { 
  private volatile Singleton instance = null; 
  public Singleton getInstance() { 
    if (instance == null) { 
      synchronized(this) { 
        if (instance == null) { 
          instance = new Singleton(); 
        } 
      } 
    } 
    return instance; 
  } 
} 

추천 방법 은 Initialization on Demand Holder (IODH),

public class Singleton { 
  static class SingletonHolder { 
    static Singleton instance = new Singleton(); 
  } 
   
  public static Singleton getInstance(){ 
    return SingletonHolder.instance; 
  } 
} 

이상 은 본문의 모든 내용 입 니 다. 자바 프로 그래 밍 을 배 우 는 데 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기