Android 단일 모드의 네 가지 실현 방식

4226 단어 Android단일 모드

하나.굶주림식


public class SingletionStarving {

    private static final SingletionStarving mInstance = new SingletionStarving();

    private SingletionStarving() {

    }

    public static SingletionStarving getInstance() {
        return mInstance;
    }
}
  • 구조 함수는private로 수식되어 외부에 접근할 수 없습니다
  • 정적 대상을 선언할 때 초기화됩니다
  • static 키워드 수식, 정적 변수, 메모리에 저장, 데이터 하나만..
  • final 키워드는 한 번만 초기화되기 때문에 mInstance 실례는 하나뿐입니다..
  • 2.게으름뱅이식

    
    public class SingletionSlacker {
    
        private static SingletionSlacker mInstance;
    
        private  SingletionSlacker() {}
    
        public static synchronized SingletionSlacker getInstance() {
            if (mInstance == null) {
                mInstance = new SingletionSlacker();
            }
            return mInstance;
        }
    }
    
  • 구조 함수는private로 수식되어 외부에 접근할 수 없습니다
  • 사용할 때 getInstance를 호출할 때 초기화합니다
  • static 키워드 수식, 정적 변수, 메모리에 저장, 데이터 하나만..
  • synchronized 스레드 안전, 다중 스레드 상황에서 단일 사례의 유일성
  • 단점: getInstance를 한 번 호출하지 않으면 자원을 낭비합니다.
  • 셋.이중 검사 잠금 방식


    인터넷에서 가장 많이 추천하고 사용하는 방법
    
    public class Singletion {
    
        private static Singletion mInstance;
    
        private Singletion() {}
    
        public static Singletion getmInstance() {
            if (mInstance == null) {
                synchronized (Singletion.class) {                if (mInstance == null) {
                        mInstance = new Singletion ();                }
                }
            }
            return mInstance;
        }
    }
    
  • 구조 함수는private로 수식되어 외부에 접근할 수 없습니다
  • 사용할 때 getInstance를 호출할 때 초기화합니다
  • static 키워드 수식, 정적 변수, 메모리에 저장된 데이터는 하나입니다
  • synchronized 스레드 안전, 다중 스레드 상황에서 단일 사례의 유일성
  • 두 번의 판단 공백, 여러 번의 동기화 피하기(synchronized)
  • 결점
    
    private static Singletion mInstance;
    private Singletion() {}
    public static Singletion getmInstance() {}
    
    jvm 특성 때문에 무작위로 실행할 수 있습니다. 위의 세 문장 코드의 순서가 정해지지 않으면 실효 문제가 발생할 수 있습니다.
    1단계, 만약 A 스레드가 getmInstance () 를 실행하고 구조 방법을 실행하지 않았다면 Singletion ()
    2단계, 이때 B 스레드에서 getmInstance()가 호출됩니다.A가 getmInstance () 를 실행했기 때문에 mInstance 를 비워 두지 않고 가져옵니다.
    3단계, B가 직접 얻기 때문에 실제 상황은 A라인 구조 방법이 아직 실행되지 않았기 때문에 mInstance는 비어 있다.
    이 상황은 발생 확률이 비교적 적지만 일종의 상황이다.이런 상황을 해결하기 위해java1.6은volatile 키워드를 추가하기 시작했다
    
    private volatile static Singletion mInstance;
    
    이렇게 하면 방식이 효력을 잃는 상황을 피할 수 있다.비록 volatile가 약간의 성능을 소모할 수 있기 때문에 가장 좋은 쓰기 방법은
    
    public class Singletion {
    
        private volatile static Singletion mInstance;
        private Singletion () {}
        public static Singletion getmInstance() {        if (mInstance == null) {
                synchronized (Singletion.class) {                if (mInstance == null) {
                        mInstance = new Singletion();                }
                }
            }
            return mInstance;
        }
    }
    
    비록 volatile는 방식을 완벽하게 하지만, volatile 키워드가 없는 작법은 기본적으로 대부분의 상황을 만족시킬 수 있다.높은 병렬이나java1.6 이전의 코드에서 실행하지 않으면.

    사.정적 내부 클래스 방식

    
    public class SingletionInternalClass {
    
        private SingletionInternalClass() {}
    
        public static SingletionInternalClass getInstance() {
            return SingletionInternalClassHolder.instance;
        }
    
        private static class SingletionInternalClassHolder {
            private static final SingletionInternalClass instance = new SingletionInternalClass();
        }
    }
    
    구조 함수는private로 수식되어 외부에 접근할 수 없습니다
    사용할 때 getInstance를 호출해야 초기화됩니다.
    get Instance를 호출하고 Singletion Internal Class Holder 클래스를 불러와서 스레드 안전을 확보하고 단일 사례의 유일성을 확보합니다

    총결산


    단례 모델은 그런 방식으로 실현될 수 없고, 핵심 사상은 모두 같다
    1. 구조 함수 사유화, 정적 방법으로 유일한 실례 얻기
    2. 스레드 보안
    마지막으로 문장의 **이중 잠금 방식과 정적 내부 클래스의 방식**을 사용하여 단일 모드를 만드는 것을 추천합니다.
    이상은 Android 단일 모드의 네 가지 실현 방식에 대한 상세한 내용입니다. Android 단일 모드의 실현에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!

    좋은 웹페이지 즐겨찾기