점적 면접 관: 어떻게 스 레 드 안전 한 단일 모델 을 실현 합 니까?

단일 모델 은 가장 흔히 볼 수 있 는 디자인 모델 로 서 실현 방식 이 많 습 니 다. 오늘 은 단일 모델 과 관련 된 내용 을 소개 합 니 다.
단일 모드 가 무엇 입 니까?
말 그대로 단일 모델 은 하나의 유형 이 하나의 대상 만 있 도록 확보 해 야 한다.예 를 들 어 스 레 드 탱크, 캐 시, 로그 대상, 프린터 구동 대상, 그래 픽 카드 구동 대상 등 은 인 스 턴 스 만 있 으 면 됩 니 다.만약 에 하나의 대상 이 빈번하게 만들어 져 야 한다 면 빈번 한 GC 가 필요 하고 단일 모드 로 이런 문 제 를 해결 할 수 있다.
단일 모드 의 실현 방식
단일 모델 의 실현 방식 은 매우 많 지만 전체적으로 두 가지 로 나 눌 수 있다. 굶 주 린 식 과 게 으 른 식 이다.굶 주 린 식 은 클래스 로드 과정 에서 대상 을 만 드 는 방식 이 고 게 으 른 식 은 사용 해 야 대상 을 만 드 는 방식 으로 두 가지 방식 이 각각 특징 이다.굶 주 린 한식 에 존재 하 는 문 제 는 만 들 대상 이 차지 하 는 공간 이 매우 크 고 사용 빈도 가 매우 낮 으 면 이런 방식 은 매우 수지 가 맞지 않 는 다 는 것 이다.게으름뱅이 식 은 병발 문제 에 부 딪 힐 수 있 으 므 로 대상 을 만 드 는 과정 에 자 물 쇠 를 채 우 는 것 을 고려 해 야 한다.굶 주 린 사람 이 든 게 으 른 사람 이 든 만 든 대상 은 보통 static 키 워드 를 사용 하여 수식 해 야 한다.
굶 주 림
public class Singleton {
     
	private static Singleton instance = new Singleton();
	private Singleton() {
     }
	public static Singleton getInstance() {
     
		return instance;
	}
}

위의 굶 주 린 한식 사례 는 클래스 로 딩 할 때 대상 을 만 든 다음 에 private 수식 구조 방법 을 만들어 구조 적 방법 으로 대상 을 만 드 는 것 을 방지 합 니 다.
게으름뱅이 식 단일 예 (비 스 레 드 보안 판)
public class Singleton {
     
	private static Singleton instance;
	private Singleton() {
     }
	public static Singleton getInstance() {
     
		if (instance == null) {
     
			instance = new Singleton();
		}
		return instance;
	}
}

위의 이러한 단일 방식 의 생 성 은 이 대상 을 사용 해 야 만 들 고 게으름뱅이 식 요 구 를 만족 시 킬 수 있다 는 것 을 쉽게 알 수 있다.그러나 이러한 단일 사례 를 만 드 는 방식 은 결함 이 있 습 니 다. 여러 스 레 드 가 동시에 대상 을 가 져 오 면 대상 이 비어 있 는 지 판단 하 는 곳 에서 두 스 레 드 가 동시에 도착 하면 이 조건 에 들 어가 여러 개의 대상 을 만 듭 니 다.다음은 안전 한 게으름뱅이 식 사례 를 제시한다.
게으름뱅이 식 단일 예 (synchronized 수식 스 레 드 보안 판)
public class Singleton {
     
	private static Singleton instance;
	private Singleton() {
     }
	public static synchronized Singleton getInstance() {
     
		if (instance == null) {
     
			instance = new Singleton();
		}
		return instance;
	}
}

위의 비 스 레 드 보안 버 전 을 바탕 으로 우 리 는 getInstance() 방법 에 synchronized 자 물 쇠 를 추가 하면 스 레 드 안전 버 전이 된다.그러나 이런 직접적인 방법 에 자 물 쇠 를 추가 하 는 방식 은 병행 의 효율 에 큰 영향 을 미친다. JDK 6 에서 synchronized 에 대해 큰 최적화 를 했 지만 우리 가 높 은 병행 에 대한 요 구 를 만족 시 키 지 못 한다. 다음은 더욱 효율 적 인 이중 검증 자물쇠 판 을 소개 한다.
게으름뱅이 식 단일 예 (이중 검사 잠 금 판)
public class Singleton {
     
	private static Singleton instance;
	private Singleton() {
     }
	public static Singleton getInstance() {
     
		if (instance == null) {
     
			synchronized(Singleton.class) {
     
				if (instance == null) {
     
					instance = new Singleton();
				}
			}
		}
		return instance;
	}
}

우 리 는 또한 앞의 비 스 레 드 안전 버 전 을 바탕 으로 이 이중 검사 잠 금 판 의 게으름뱅이 식 단일 예 를 실현 했다. 만약 에 여러 스 레 드 가 동시에 외부 에서 대상 이 비어 있 을 때 잠 금 자원 을 선점 하기 시작 하면 빼 앗 은 스 레 드 생 성 대상 은 더 이상 스 레 드 를 만 들 필요 가 없다.이런 방식 의 장점 은 처음 자원 을 빼 앗 았 을 때 만 동기 화 를 해 야 하고 후속 적 인 병발 은 대상 이 비어 있 지 않다 고 판단 하여 대상 으로 직접 돌아 가 는 것 이다.
게으름뱅이 식 단일 예 (정적 내부 버 전)
public class Singleton {
     
	//     
	private static class SingletonHandler {
     
		private static Singleton instance = new Singleton();
	}
	private Singleton() {
     }
	public static Singleton getInstance() {
     
		return SingletonHandler.instance;
	}
}

이 방식 은 여전히 게으름뱅이 식 단일 사례 로 정적 내부 류 를 이용 하여 이 루어 질 뿐 아니 라 스 레 드 도 안전 하 다.
굶 주 린 한식 일례 (매 거 판)
public class EnumSingleton {
     
	private EnumSingleton() {
     }
	public static EnumSingleton getInstance(){
     
        return Singleton.singletonFactory.getInstance();
    }
	private enum Singleton {
     
		singletonFactory;
		private EnumSingleton instance;
		private Singleton() {
     	//                 
			instance = new EnumSingleton();
		}
		public EnumSingleton getInstance() {
     
			return instance;
		}
	}
}

위 는 매 거 진 단일 대상 을 만 드 는 방법 으로 매 거 진 로 딩 시 구조 방법의 특징 을 이용 하여 단일 모델 을 실현 하 는 것 이 비교적 추천 하 는 방법 이다.

좋은 웹페이지 즐겨찾기