단일 모드 자바 구현 (5 가지)

5188 단어 디자인 모드
방식 1: 게으름뱅이 모드 (좋 지 않 음) 설명: 단일 스 레 드 환경 에 만 적 용 됩 니 다. 여러 스 레 드 접근 은 여러 대상 을 만 들 수 있 습 니 다.
public class Singleton1{
    private static Singleton1 instance;

    }
    public static Singleton1 getInsatnce(){
        if(null == instance){
            instance = new Singleton1();
        }
        return instance;
    }
}

스 레 드 안전 한 게으름뱅이 모드 (좋 지 않 음) 설명: 이런 방식 은 인 스 턴 스 를 얻 을 때마다 동기 화 자 물 쇠 를 추가 하고 자 물 쇠 를 추가 하 는 것 은 시간 이 걸 리 는 작업 이기 때문에 이 방식 은 작업 효율 이 비교적 낮다.
public class Singleton2 {
    private static Singleton2 instance;
    private Singleton2(){

    }
    public static synchronized Singleton2 getInsatnce(){
        if(null == instance){
            instance = new Singleton2();
        }
        return instance;
    }
}

방식 2: 동기 화 자 물 쇠 를 추가 하고 앞 뒤 두 번 에 걸 쳐 인 스 턴 스 가 2 경 존재 하 는 지 판단 합 니 다. (실행 가능) 설명: 이런 방식 은 인 스 턴 스 가 null 일 때 만 자 물 쇠 를 추가 해 야 합 니 다. 그 당시 인 스 턴 스 가 만들어 지면 자 물 쇠 를 추가 하지 않 아 도 됩 니 다. 그러면 효율 이 Singleton 2 보다 훨씬 좋 습 니 다. 그러나 이러한 코드 는 실현 하기에 비교적 복잡 하고 오류 가 발생 하기 쉽 습 니 다.
public class Singleton3 {
    private volatile static Singleton3 instance;
    private Singleton3(){
        System.out.println("      !!!");
    }
    public static Singleton3 getInsatnce(){
        if(null == instance){
            synchronized (Singleton3.class) {
                if(null == instance){
                    instance = new Singleton3();
                }
            }
        }
        return instance;
    }
}

방식 3: 굶 주 린 모드 (사용 권장) 설명: 게 으 름 없 이 메모리 사용량 감소
public class Singleton4 {
    private static Singleton4 instance = new Singleton4();
    private Singleton4(){
        System.out.println("      !!!");
    }
    public static Singleton4 getInsatnce(){
        return instance;
    }
}

방식 4: 매 거 진 (사용 권장)
public enum Singleton6 {
    INSTANCE;
    public static Singleton6 getInstance(){
        return Singleton6.INSTANCE;
    }
}

방식 5: 정적 내부 클래스 (사용 권장) 설명: 내부 정적 클래스 방안 에서 대상 의 로드 도 게으름뱅이 모드 이 고 내부 클래스 의 classloader 체 제 를 사용 하여 스 레 드 안전성 을 확보 합 니 다.자바 가상 컴퓨터 에서 클래스 의 생명 주 기 는 연결 을 불 러 오고 초기 화 하 는 것 을 포함 합 니 다.jvm 은 클래스 의 초기 화 과정 이 동기 화 되 는 것 을 보증 합 니 다.
public class Singleton5 {
    private static class SingletonHolder{
        private static final Singleton5 INSTANCE = new Singleton5();
    }
    private Singleton5(){
        System.out.println("      !!!");
    }
    public static Singleton5 getInsatnce(){
        return SingletonHolder.INSTANCE;
    }
}

좋은 웹페이지 즐겨찾기