Android 디자인 모드 의 단일 예 모드 Singleton

개술
단일 모델 은 디자인 모델 에서 가장 간단 한 것 이지 만 디자인 모델 중의 각종 대상 간 의 추상 적 인 관계 가 없 기 때문에 어떤 사람들 은 이것 이 모델 이 아니 라 실현 기교 라 고 생각 하지 않 는 다. 단일 모델 은 글자 의 뜻 처럼 자신 만 의 실례 화 된 실례 를 제공한다.또한 전체적인 접근 점 을 제공 합 니 다. 이 몇 가지 요 구 를 달성 하려 면 세 가 지 를 만족 시 켜 야 합 니 다. 개인 구조 함수 (다른 사람 에 의 해 예화 되 는 것 을 방지), 정적 개인 자체 대상 (인 스 턴 스 제공), 정적 공유 getInstance 방법 (인 스 턴 스 대상 을 만 들 고 가 져 오 는 데 사용).
장단 점:
하나의 예 는 자신 이 하나의 인 스 턴 스 를 만 들 수 있 고 자주 만 들 거나 소각 할 필요 가 없 으 며 메모리 가 대상 의 접근 속 도 를 가속 화 할 수 있 습 니 다.
그러나 단일 사례 는 추상 적 인 층 과 핑계 가 없어 확장 하기 어렵다. 단일 사례 는 공장 방법 도 제공 하고 업무 방법 도 제공 하 며 어느 정도 단일 직책 원칙 에 위배 된다.
단 례 실현
단일 사례 의 실현 은 두 가지 주류 방식 이 있 는데 그것 이 바로 게으름뱅이 모델 과 굶 주 린 남자 모델 이다. 그들 은 사례 화 된 시기 와 효율 에 있어 각각 다르다.
1. 게으름뱅이 모드
/**
 * Created by jesse on 15-6-28.
 */
public class Singleton {
    private static Singleton instance;
    private Singleton() {} //        ,      
    public static Singleton getInstance(){
        if (null == instance){
            instance = new Singleton();
        }
        return instance;
    }
}

게으름뱅이 모드 는 외부 대상 이 인 스 턴 스 를 받 을 때마다 이 인 스 턴 스 가 초기 화 되 었 는 지 여 부 를 판단 해 야 합 니 다. 이 점 은 굶 주 린 사람 모드 에 비해 효율 적 이지 만 공간 을 절약 할 수 있 습 니 다. 이 인 스 턴 스 를 언제 사용 해 야 초기 화 되 는 지, 사용 하지 못 하면..게으름뱅이 모드 에 서 는 이 대상 을 구성 하지 않 습 니 다. 공간 으로 시간 을 바 꾸 는 것 과 같 습 니 다. 즉, 로드 지연 기술 입 니 다. 그리고 주의해 야 할 것 은 반드시 사유 구조 가 있어 야 합 니 다. 그렇지 않 으 면 외부 대상 이 이 대상 을 예화 할 수 있 습 니 다. 그러면 어떤 사례 가 있 습 니까?
이 럴 때 많은 동료 들 이 말 하려 고 합 니 다. 게으름뱅이 가 한 번 에 문제 가 있 습 니 다. 스 레 드 안전 문제 가 있 습 니 다. 물론 이 방식 은 스 레 드 가 안전 하지 않 습 니 다. 두 스 레 드 A 와 B 가 동시에 인 스 턴 스 를 얻 으 려 고 할 때 인 스 턴 스 는 아직 초기 화 되 지 않 았 습 니 다. A 가 먼저 시간 영 화 를 받 아 인 스 턴 스 를 초기 화 했다 고 가정 합 니 다. 인 스 턴 스 가 초기 화 되 지 않 았 을 때 시간 영 화 는 B 에 게 양보 합이 때 인 스 턴 스 가 초기 화 되 지 않 았 기 때문에 인 스 턴 스 가 비어 있 기 때문에 B 는 인 스 턴 스 를 한 번 예화 합 니 다. 최종 결 과 는 인 스 턴 스 가 두 번 예화 되 었 습 니 다. 이것 은 심각 한 결 과 를 초래 할 수 있 습 니 다. 해결 방식 은 잠 금 (일부 성능 희생) 을 추가 하고 굶 주 린 사람 모드 를 사용 하 는 것 입 니 다.
getInstance 방법 에 자 물 쇠 를 추가 합 니 다. 이러한 잠 금 방식 은 스 레 드 안전 문 제 를 해결 할 수 있 습 니 다. 그러나 외부 대상 이 인 스 턴 스 를 가 져 올 때마다 스 레 드 잠 금 을 해 야 합 니 다. 그 다음 에 인 스 턴 스 가 예화 되 었 는 지 판단 해 야 합 니 다. 그러면 다 중 스 레 드 가 높 고 동시 다발 적 인 상황 에서 효율 적 인 손실 이 상당 합 니 다.
public class Singleton {
    private static Singleton instance;
    private Singleton() {} 
    public static synchronized Singleton getInstance(){// getInstance    
        if (null == instance){
            instance = new Singleton();
        }
        return instance;
    }
}

그 후에 쌍 검 자물쇠 의 인 스 턴 스 방식 이 확대 되 었 다. 이런 방식 은 첫 번 째 예화 할 때 만 자 물 쇠 를 추가 하고 자 물 쇠 를 추가 하 는 전후 에 모두 예화 여 부 를 판단 한다. 성능 면 에서 단 검 자물쇠 보다 우수 하 다. 그러나 이런 쌍 검 자 물 쇠 는 또 하나의 문 제 를 만 날 수 있다.즉, 서로 다른 플랫폼 이나 서로 다른 컴 파일 러 에서 오류 가 발생 할 수 있 습 니 다. 주로 일부 컴 파일 러 가 new Singleton () 의 과정 을 최적화 시 켰 기 때 문 입 니 다. 스 레 드 AB 가 동시에 인 스 턴 스 를 가 져 온다 고 가정 하면 일부 컴 파일 러 에서 A 스 레 드 실례 화 인 스 턴 스 가 나타 날 수 있 습 니 다. 시스템 이 인 스 턴 스에 메모리 에 할당 되 었 지만 인 스 턴 스 의 구성원 변 수 를 초기 화하 지 않 았 을 때.시간 영 화 는 B 프로 세 스에 게 양보 되 었 습 니 다. 이때 인 스 턴 스 는 null 이 아 닙 니 다. B 는 인 스 턴 스 를 가지 고 멤버 변 수 를 조작 합 니 다. 그러나 이때 멤버 변 수 는 초기 화 되 지 않 았 고 결 과 는 crash 일 수 있 습 니 다. 이런 컴 파일 러 문제 가 발생 했 을 때 인 스 턴 스 변 화 량 에 volatile 수식 을 추가 하여 컴 파일 러 최적화 에 대한 방 해 를 제거 해 야 합 니 다.
public class Singleton {
    private static Singleton instance;
    //private static volatile Singleton instance;           
    private Singleton() {}
    public static Singleton getInstance(){
        if (null == instance){
            synchronized(Singleton.class){
                if (null == instance)
                    instance = new Singleton();
            }

        }
        return instance;
    }
}

2. 굶 주 린 남자 모드
굶 주 린 사람 모드 는 시스템 이 실 행 될 때 클래스 에 설치 할 때 초기 화 하 는 작업 입 니 다. 외부 대상 이 사용 할 때 어떠한 판단 도 하지 않 고 직접 사용 할 수 있 습 니 다. 효율 적 으로 게으름뱅이 모드 보다 좋 습 니 다. 그러나 게으름뱅이 모드 의 지연 로드 기술 에 비해 시스템 이 이 인 스 턴 스 를 사용 하 든 사용 하지 않 든메모 리 는 처음부터 만들어 집 니 다. 게으름뱅이 의 시간 과 공간 을 바 꾸 는 것 은 정반 대 입 니 다. 굶 주 린 사람 은 공간 을 바 꾸 는 것 입 니 다.
public class Singleton {
    private static final Singleton instance = new Singleton();
    private Singleton() {}//        ,      
    public static Singleton getInstance(){
        return instance;
    }
}

총화
위의 분석 을 통 해 알 수 있 듯 이 굶 주 린 사람 모델 은 스 레 드 와 병행 하 는 문제 에 직면 하지 않 아 도 된다. 또한 호출 속도 와 응답 시간 에 있어 굶 주 린 사람 모델 은 게으름뱅이 모델 보다 우수 하지만 자원 이용 의 측면 에서 볼 때 게으름뱅이 모델 은 굶 주 린 사람 모델 보다 우수 하 다.
전재 출처 를 밝 혀 주 십시오: http://blog.csdn.net/l2show/article/details/46672061

좋은 웹페이지 즐겨찾기