자바 의 이중 검사 (Double - Check) 상세 설명
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;
}
}
이상 은 본문의 모든 내용 입 니 다. 자바 프로 그래 밍 을 배 우 는 데 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.