단일 모드 에 대해 서 얘 기해 볼 게 요.

6838 단어 자바 기반
단일 모델 은 창조 형 디자인 모델 에 속한다.
전체적으로 말 하면 게으름뱅이 형 과 굶 주 린 남자 형 사례 모델 로 나 눌 수 있 는데 다음 에 몇 가지 사례 모델 의 작성 방법 을 열거 하고 하나씩 분석 하 겠 습 니 다.
1. 굶 주 린 한식 단일 모드 (라인 안전)
package com.wantao.concurrency.singleton;

/**
 *        1
 */
public class Singleton1 {
    private static Singleton1 instance = new Singleton1();//          

    private Singleton1() {
    }

    public static Singleton1 getInstance() {
        return instance;
    }

    public static void main(String[] args) {
        System.out.println(Singleton1.getInstance().hashCode());
        System.out.println(Singleton1.getInstance().hashCode());
    }
}

분석: 이것 은 굶 주 린 사람 형 단일 사례 모델 의 전형 적 인 쓰기 입 니 다. 클래스 로 딩 할 때 대상 을 만 들 었 기 때문에 이런 방식 은 스 레 드 안전 에 속 합 니 다.
2. 굶 주 린 사람 형 단일 모드 (스 레 드 안전)
package com.wantao.concurrency.singleton;

/**
 *        2
 */
public class Singleton2 {
    private static Singleton2 instance = null;

    static {
        instance = new Singleton2();
    }

    private Singleton2() {

    }

    public static Singleton2 getInstance() {
        return instance;
    }

    public static void main(String[] args) {
        System.out.println(Singleton2.getInstance().hashCode());
        System.out.println(Singleton2.getInstance().hashCode());
    }
}

분석: 이것 도 굶 주 린 한 식 단일 사례 모델 입 니 다. 위의 쓰기 에 비해 대상 을 만 드 는 과정 을 static 코드 블록 에 두 었 을 뿐 입 니 다. 단, 주의해 야 합 니 다.
3. 게으름뱅이 형 단일 모드 (라인 이 안전 하지 않 음)
package com.wantao.concurrency.singleton;

/**
 *        1
 */
public class Singleton3 {
    private Singleton3() {

    }

    private static Singleton3 instance = null;

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

    public static void main(String[] args) {
        System.out.println(Singleton3.getInstance().hashCode());
        System.out.println(Singleton3.getInstance().hashCode());
    }
}

분석: 이것 은 가장 간단 한 게으름뱅이 식 단일 사례 모델 로 첫 번 째 방문 때 만 인 스 턴 스 를 만 듭 니 다.그러나 이런 표기 법 은 라인 이 안전 하지 않다.
        A, B 두 스 레 드 가 동시에 getInstance () 방법 으로 생 성 된다 고 가정 하면 인 스 턴 스 가 모두 비어 있 고 두 스 레 드 모두 new 새로운 대상 이 됩 니 다.
4. 게으름뱅이 모드 (라인 은 안전 하지만 추천 하지 않 음)
package com.wantao.concurrency.singleton;

/**
 *        2
 */
public class Singleton4 {
    private Singleton4() {

    }

    private static Singleton4 instance = null;

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

    public static void main(String[] args) {
        System.out.println(Singleton4.getInstance().hashCode());
        System.out.println(Singleton4.getInstance().hashCode());
    }
}

분석: synchronized 동기 화 방법 을 사용 하여 스 레 드 가 안전 하지만 매번 한 스 레 드 만 대상 을 얻 을 수 있 고 효율 이 너무 낮 습 니 다.
5. 게으름뱅이 형 단일 모드 (라인 은 안전 하지만 추천 하지 않 음)
package com.wantao.concurrency.singleton;

/**
 *        3
 */
public class Singleton5 {
    private Singleton5() {

    }

    private static Singleton5 instance = null;

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

    public static void main(String[] args) {
        System.out.println(Singleton5.getInstance().hashCode());
        System.out.println(Singleton5.getInstance().hashCode());
    }
}

   분석: 이런 문법 은 위 와 같 지만 synchronized 수식 은 방법 이 아니 라 코드 블록 이다.
6. 게으름뱅이 형 단일 모드 (스 레 드 가 안전 하지 않 음)
package com.wantao.concurrency.singleton;

/**
 *       4
 */
public class Singleton6 {
    private Singleton6(){

    }
    private static Singleton6 instance=null;
    public static Singleton6 getInstance(){
        if(instance==null){
            synchronized (Singleton6.class){
                if(instance==null){
                    instance=new Singleton6();
                }
            }
        }
        return instance;
    }
    public static void main(String[] args) {
        System.out.println(Singleton6.getInstance().hashCode());
        System.out.println(Singleton6.getInstance().hashCode());
    }
}

분석: 이중 검 측 과 synchronized (double checked locking) 를 사용 하여 단일 모드 를 실현 합 니 다. 스 레 드 가 안전 해 보이 지만 jvm 의 명령 으로 재배 치 되 는 것 도 안전 하지 않 습 니 다.
       새 대상 은 보통 세 단계:
                                         1. 더미 위 에 메모리 공간 할당
                                         2. 대상 초기 화
                                          3. 대상 의 인용 을 방금 분 배 된 메모리 공간 으로 가리킨다.
        그러나 jvm 의 명령 을 거 쳐 정렬 한 후 순 서 는 132 로 바 뀔 수 있 습 니 다.
        이렇게 하면 A, B 두 개의 스 레 드 가 있 으 면 A 스 레 드 가 1, 3 두 단 계 를 완 료 했 을 때 B 스 레 드 는 이때 도 대상 을 가 져 오고 초기 화 되 지 않 은 대상 을 가 져 옵 니 다.
7. 게으름뱅이 형 단일 모드 (스 레 드 안전, 추천 사용)
package com.wantao.concurrency.singleton;

/**
 *       5
 */
public class Singleton7 {
    private Singleton7(){

    }
    private static volatile Singleton7 instance=null;
    public static Singleton7 getInstance(){
        if(instance==null){
            synchronized (Singleton7.class){
                if(instance==null){
                    instance=new Singleton7();
                }
            }
        }
        return instance;
    }
    public static void main(String[] args) {
        System.out.println(Singleton7.getInstance().hashCode());
        System.out.println(Singleton7.getInstance().hashCode());
    }
}

분석: 위의 방법 에 비해 volatile 키 워드 를 사용 하여 명령 정렬 을 금지 하여 스 레 드 를 안전 하 게 만 들 었 습 니 다.
8. 게으름뱅이 형 단일 모드 (스 레 드 안전, 추천 사용)
package com.wantao.concurrency.singleton;

/**
 *       6
 */
public class Singleton8 {
    private Singleton8(){

    }
    public static Singleton8 getInstance(){
         return Singleton.INSTANCE.getInstance();
    }
    private enum Singleton{
        INSTANCE;
        private Singleton8 instance;
         Singleton(){
            instance=new Singleton8();
        }
        public Singleton8 getInstance(){
             return instance;
        }

    }
    public static void main(String[] args) {
        System.out.println(Singleton8.getInstance().hashCode());
        System.out.println(Singleton8.getInstance().hashCode());
    }
}

분석: enum (매 거 진) 방식 을 사용 합 니 다. 기본 값 은 라인 이 안전 합 니 다. 추천 합 니 다.
 
굶 주 린 한식 과 게 으 른 단식 모드 비교:
    1. 굶 주 린 사람 은 클래스 로 딩 할 때 인 스 턴 스 를 만 들 었 습 니 다. 그 자체 가 스 레 드 가 안전 하고 게 으 른 사람 은 첫 번 째 호출 에서 인 스 턴 스 를 만 들 었 습 니 다. 잠 금 이나 enum 을 추가 하여 스 레 드 안전 을 실현 해 야 합 니 다.
    2. 배 고 픈 한식 단일 모드 는 잠 금 을 넣 지 않 아 효율 이 높 지만 처음부터 예화 되 었 으 나 마지막 에 호출 되 지 않 으 면 메모 리 를 낭비 합 니 다.
 
전 재 는 글 의 주 소 를 밝 혀 주 십시오:https://blog.csdn.net/niangou0915/article/details/90316476

좋은 웹페이지 즐겨찾기