자바 단일 모드 의 몇 가지 쓰기

7472 단어 자바
많은 사례 를 써 서 이 루어 졌 는데,오늘 은 책 속 의 쓰 기 를 붙 였 다.단일 모드 정의:하나의 디자인 모드 는 클래스 에 하나의 인 스 턴 스 를 만 들 때 만 사용 합 니 다.요구:인 스 턴 스 를 만 드 는 방식 만 있 을 수 있 으 며 초기 화 되 지 않 은 상태 에 있 는 대상 의 인용 을 얻 을 수 없습니다.따라서 단일 모드 에 서 는 private 라 는 구조 적 방법 이 필요 하고 한 번 만 호출 해 야 한다.
package oop;

/** *      * * @author lunatictwo */
public class Singleton {

    private final static Singleton instance = new Singleton();
    private static boolean isInit = false;

    //     ,     instance        
    private Singleton() {
        super();
    }

    private void init() {
        //             
    }

    //             
    public static synchronized Singleton getInstance() {
        if (isInit) {
            return instance;//       
        }
        instance.init();//     ,         ,                
        isInit = true;
        return instance;
    }

}

이 때 단일 인 스 턴 스 를 가 져 올 때 getInstance()를 통 해서 만 가 져 올 수 있 습 니 다.
업데이트:(2016-01-23):헷 갈 리 지 않도록 오늘 몇 가지 다른 문법 을 추가 합 니 다.
위 에 쓰 인 사례 는 굶 주 린 사람 모드 의 동기 화 안전 표기 법 에 속 합 니 다.대상 을 사용 하기 전에 초기 화 시 켜 대상 이 굶 어 죽지 않도록 하 는 것 입 니 다.지금 은 게으름뱅이 모드 의 사례 를 붙 입 니 다.
package oop;

/** * LazySingleton * * @author lunatictwo * */
public class LazySingleton {
    private static LazySingleton instance = null;

    private LazySingleton() {
        super();
    }

    public static LazySingleton getInstance() {
        if (null == instance) {
            instance = new LazySingleton();
        }
        return instance;
    }
}

스 레 드 가 안전 하지 않다 고 생각 되면 동기 화 자 물 쇠 를 추가 하 십시오.
package oop;

/** * LazySingleton * * @author lunatictwo * */
public class LazySingleton {
    private static LazySingleton instance = null;

    private LazySingleton() {
        super();
    }

    public static synchronized LazySingleton getInstance() {//     
        if (null == instance) {
            instance = new LazySingleton();
        }
        return instance;
    }
}

또한 효율 을 높이 기 위해 대상 을 만 들 때 만 잠 금 동기 화(이중 검사)를 추가 할 수 있 습 니 다.그러나 이 모델 은 다음 과 같 습 니 다.
package oop;

/** * DoubleCheckSingleton * * @author lunatictwo * */
public class DoubleCheckSingleton {
    private static DoubleCheckSingleton instance = null;

    private DoubleCheckSingleton() {
        super();
    }

    public static synchronized DoubleCheckSingleton getInstance() {
        if (null == instance) {
            synchronized (DoubleCheckSingleton.class) {
                if (null == instance) {
                    instance = new DoubleCheckSingleton();
                }
            }
        }
        return instance;
    }
}

그러나 이 쓰기 에는 위험 이 존재 합 니 다.두 스 레 드 가 대상 인 스 턴 스 를 초기 화 할 때 대상 을 초기 화 하 는 데 시간 이 필요 하기 때문에 첫 번 째 스 레 드 가 대상 주 소 를 만 든 후(완전히 만 들 지 않 았 을 때)두 번 째 스 레 드 는 대상 이 이미 존재 한다 고 판단 하기 때문에 대상 인 스 턴 스 를 직접 되 돌려 줍 니 다.그러나 두 번 째 스 레 드 에 있어 서 이 대상 의 인 스 턴 스 는 완전히 초기 화 되 지 않 았 다.그래서 이런 글 씨 는 추천 하지 않 습 니 다.
사실 가장 좋 은 문법 은 내부 클래스 를 사용 하 는 것 이다.라인 안전 도 할 수 있 고 문법 도 간단 하 다.다음 과 같다.
package oop;

/** * InternalClassSingleton * * @author lunatictwo * */
public class InternalClassSingleton {
    private static class InternalClassSingletonHandler {
        public final static InternalClassSingleton instance = new InternalClassSingleton();
    }

    public static InternalClassSingleton getInstance() {
        return InternalClassSingletonHandler.instance;
    }

}

좋은 웹페이지 즐겨찾기