점적 면접 관: 어떻게 스 레 드 안전 한 단일 모델 을 실현 합 니까?
단일 모드 가 무엇 입 니까?
말 그대로 단일 모델 은 하나의 유형 이 하나의 대상 만 있 도록 확보 해 야 한다.예 를 들 어 스 레 드 탱크, 캐 시, 로그 대상, 프린터 구동 대상, 그래 픽 카드 구동 대상 등 은 인 스 턴 스 만 있 으 면 됩 니 다.만약 에 하나의 대상 이 빈번하게 만들어 져 야 한다 면 빈번 한 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;
}
}
}
위 는 매 거 진 단일 대상 을 만 드 는 방법 으로 매 거 진 로 딩 시 구조 방법의 특징 을 이용 하여 단일 모델 을 실현 하 는 것 이 비교적 추천 하 는 방법 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.