자바 디자인 모드 학습 의 단일 예 모드

7319 단어 디자인 모드
1. 소개
단일 대상 (Singleton) 은 자주 사용 하 는 디자인 모델 이다.자바 응용 에서 단일 대상 은 하나의 JVM 에서 이 대상 은 하나의 인 스 턴 스 만 존재 할 수 있 습 니 다.이러한 모델 은 몇 가지 장점 이 있다. 1) 일부 유형의 창설 이 비교적 빈번 하고 일부 대형 대상 에 대해 이것 은 매우 큰 시스템 비용 이다.2) new 연산 자 를 줄 이 고 시스템 메모리 의 사용 빈 도 를 낮 추어 GC 의 압력 을 줄인다.3) 거래소 의 핵심 거래 엔진 과 같은 일부 유형 은 거래 절 차 를 통제 하고 있다. 만약 에 이런 유형 이 여러 개 를 만 들 수 있다 면 시스템 이 완전히 엉망 이 된다.(예 를 들 어 한 군대 에 여러 명의 사령관 이 동시에 지휘 하면 난리 가 날 것 이다) 그래서 단일 모델 을 사용 해 야 핵심 거래 서버 가 전체 절 차 를 독립 적 으로 통제 할 수 있다.
자바. lang. Runtime 에서 단일 모드 를 사 용 했 습 니 다. 자바 프로그램 은 모두 Runtime 류 의 단일 인 스 턴 스 를 가지 고 있 습 니 다. Runtime. getRuntime () 을 통 해 Runtime 류 의 인 스 턴 스 를 가 져 옵 니 다.
2. 생활 화
예 를 들 어 합창단 에 지휘자 가 한 명 밖 에 없다. 만약 에 지휘자 가 여러 명 있 으 면 좋 은 합창 이 어 지 러 워 진다. 예 를 들 어 한 길목 에 신호등 만 있 고 도로 가 잘 통한다. 만약 에 여러 개 있 으 면 여러 개의 신호등 시간 이 일치 하면 납세자 의 돈 을 낭비 하 는 것 이다. 만약 에 여러 개의 신호등 의 시간 이 일치 하지 않 으 면 어떤 것 은 빨 개 진다.어떤 것 은 녹색 이 고, 그 결말 은 상상 할 수 없다!
3. 코드 화
3.1 굶 주 린 한식 은 가장 간단 한 실현 을 먼저 생각 하 는데 그것 이 바로 구조 함 수 를 사유 화하 고 private 라 고 써 서 다른 유형 이 실례 화 되 지 않도록 하 는 것 이다.
package com.tl.skyLine.pattern.singletonPattern;

/**
 * Created by tl on 17/3/8.
 */
public class Singleton {
    //   Singleton      
    private static Singleton instance = new Singleton();

    //       private,           
    private Singleton() {

    }

    //         
    public static Singleton getInstance() {
        return instance;
    }
}

이 방법 은 가장 간단 한 실현 이지 만 클 라 스 류 를 불 러 올 때 대상 을 초기 화하 고 메모 리 를 낭비 하 는 것 을 배 고 픈 식 이 라 고 합 니 다. 배가 고 파 서 음식 을 가리 지 않 는 다 는 뜻 일 수도 있 습 니 다.3.2 게으름뱅이 식, 스 레 드 가 안전 하지 않 습 니 다. 말 그대로 게 으 름 로드 를 실현 하고 getInstance 방법 을 진정 으로 호출 할 때 대상 을 초기 화 합 니 다.
public class Singleton {
    private static Singleton instance;

    //       private,           
    private Singleton() {

    }

    //         ,         ,    new  
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

이런 실현 방식 의 가장 큰 문 제 는 다 중 스 레 드 를 지원 하지 않 고 단일 스 레 드 환경 에서 만 사용 하 는 것 이다.3.3 게으름뱅이 식, 스 레 드 안전
public class Singleton {
    private static Singleton instance;

    //       private,           
    private Singleton() {

    }

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

첫 번 째 호출 이 초기 화 되 어 메모리 낭 비 를 피 하 는 것 이 장점 입 니 다. 단점 은 잠 금 synchronized 를 추가 해 야 하나의 예 를 보장 할 수 있 지만 잠 금 을 추가 하면 효율 에 영향 을 줄 수 있 습 니 다.3.4 이중 검사 자물쇠 / 이중 검사 자물쇠 (DCL, 즉 double - checked locking) 위의 스 레 드 안전 한 게으름뱅이 코드 에 도 성능 에 영향 을 주 는 문제 가 존재 합 니 다. 모두 가 알 고 있 듯 이 자 물 쇠 를 추가 하면 효율 에 영향 을 주 고 다 중 스 레 드 를 추가 하지 않 으 면 안전 하지 않 습 니 다. 그러나 실제 적 으로 우 리 는 스 레 드 안전 을 확보 해 야 합 니 다. 인 스 턴 스 대상 이 null 과 같 을 때 new Singleton () 이라는 코드 를 실행 해 야 합 니 다.getInstance 방법 을 호출 할 때마다
public class Singleton {
    private volatile static Singleton instance;

    //       private,           
    private Singleton() {

    }

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

이렇게 자 물 쇠 를 채 우 는 상황 에서 성능 이 향상 되 었 습 니 다. 여기 서 synchronized (Singleton. class) 와 synchronized (this) 의 차 이 를 많이 말 해 보 세 요. 처음에 손 쉽게 synchronized (this) 를 썼 는데 아 쉽게 도 아이디어 가 잘못 되 었 습 니 다. 나중에 보 니 이 방법 은 정적 이 고 전체 유형 을 겨냥 한 것 입 니 다. this 는 특정한 대상 입 니 다.이렇게 하면 정적 방법 에서 비 정적 속성 을 호출 하 는 오류 가 발생 합 니 다.3.5 정적 내부 클래스
public class Singleton {
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    //       private,           
    private Singleton() {

    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

이런 방식 은 JVM 내부 의 classloder 메커니즘 을 사용 했다. 즉, 클래스 의 구 조 는 반드시 원자 적 이 고 비 병발 적 이 어야 하 며 클래스 가 불 러 올 때 이 클래스 의 불 러 오 는 과정 은 라인 이 서로 배척 되 기 때문에 동기 블록 을 추가 할 필요 가 없다.마찬가지 로 static 의미 도 여러 개의 인 스 턴 스 가 존재 하지 않도록 요구 합 니 다. 그러면 우리 가 처음으로 getInstance 를 호출 할 때 JVM 은 인 스 턴 스 가 한 번 만 생 성 되 고 인 스 턴 스 에 할당 한 메모리 초기 화 를 보장 할 수 있 습 니 다.
몇 가지 방법 을 종합해 보면 보통 2, 3 이라는 두 가지 게으름뱅이 방법 을 사용 하 는 것 을 권장 하지 않 고 첫 번 째 굶 주 린 사람 식 을 사용 하 는 것 을 권장 합 니 다. 영어 의 대부분 상황 은 동기 화 를 사용 할 필요 가 없습니다. 사용 해 야 할 게 으 른 로드 와 다 중 스 레 드 를 사용 할 때 사용 방식 4 또는 5 를 권장 합 니 다.

좋은 웹페이지 즐겨찾기