디자인 모드 - 1 - 단일 모드

1. 단일 모드 는 무엇 입 니까?
정의: 하나의 클래스 에서 어떠한 상황 에서 도 하나의 인 스 턴 스 만 있 고 전체적인 방문 점 을 제공 합 니 다.
단일 사례 모델 의 주요 특징: 1. 구조 방법 민영화;2. 실례 화 된 변 수 는 사유 화 를 인용한다.3. 인 스 턴 스 를 얻 는 방법 은 모두 있 습 니 다.
2. 단일 모드 는 어떤 것 이 있 습 니까?
1. 굶 주 림 식 (정적 상수)

public class HungrySingleton1 {
    //1.         
    private static final HungrySingleton1 instance = new HungrySingleton1();
    //2.     
    private  HungrySingleton1(){

    }
    //3.          ,      
    public static HungrySingleton1 getInstance(){
        return instance;
    }
}

장점: 클래스 로 딩 할 때 예화 되 어 스 레 드 동기 화 문제 의 단점 을 피 할 수 있 습 니 다. 처음부터 끝까지 인 스 턴 스 를 사용 하지 않 으 면 메모리 낭비 결론 을 초래 할 수 있 습 니 다. 사용 할 수 있 지만 자원 을 낭비 할 수 있 습 니 다.
2. 굶 주 림 식 (정적 코드 블록)
public class HungrySingleton2 {
    //1.      
    private static HungrySingleton2 instance;

    //2.      
    private HungrySingleton2(){}

    //3.          
    static {
        instance=new HungrySingleton2();
    }

    //3.          ,      
    public static HungrySingleton2 getInstance(){
        return instance;
    }
}

결론: 정적 코드 블록 에 인 스 턴 스 대상 을 만 드 는 것 과 차이 점 은 장점 과 단점 이 같 아서 메모리 자원 을 낭비 할 수 있 습 니 다.
3. 게으름뱅이 식 (라인 이 안전 하지 않 음)
public class LazySingleton1 {
    //1.      
    private static LazySingleton1 instance;

    //2.    
    private LazySingleton1(){}

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

장점: 게 으 름 피 우 는 역할 이 있 지만 단일 스 레 드 에서 만 단점 을 사용 할 수 있 습 니 다. 다 중 스 레 드 에서 한 스 레 드 가 if 블록 에 들 어가 서 아직 아래로 실행 되 지 않 았 습 니 다. 다른 스 레 드 는 if 문 구 를 통과 하면 여러 개의 인 스 턴 스 가 발생 할 수 있 습 니 다. 한 가지 유형 에서 하나의 인 스 턴 스 만 보장 하 는 원칙 을 위반 하고 다 중 스 레 드 에서 사용 할 수 없습니다 결론: 실제 개발 에서 사용 을 추천 하지 않 습 니 다.
4. 게으름뱅이 식 (스 레 드 안전, 동기 화 방법)
public class LazySingleton2 {
    private static LazySingleton2 instance;

    //2.    
    private LazySingleton2(){}

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

장점: 게 으 름 로드, 스 레 드 안전 문제 단점 해결: 모든 스 레 드 가 인 스 턴 스 를 얻 으 려 면 동기 화 방법 을 실행 해 야 합 니 다. 방법 동기 화 효율 이 낮 습 니 다. 결론: 실제 개발 에서 이런 방식 을 추천 하지 않 습 니 다.
5. 게으름뱅이 식 (스 레 드 보안, 동기 코드 블록)
public class LazySingleton3 {
    //1.         
    private static LazySingleton3 instance;

    //2.    
    private LazySingleton3(){}

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

결론: 추천 하지 않 음
**
6. 이중 검사 방식
**
public class DoubleCheckSingleton {
    //1.          
    private static volatile DoubleCheckSingleton instance;

    //2.     
    private DoubleCheckSingleton(){}

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


장점: 1. 다 중 스 레 드 개발 에서 자주 사용 되 고 if 판단 을 두 번 사용 하여 스 레 드 의 안전 을 확보 합 니 다.2. 예화 코드 는 한 번 만 실행 하고 나중에 다시 방문 하여 if (instance = = null) 가 직접 return 인 스 턴 스 를 판단 하여 반복 적 인 방법 동기 화 를 피한다.3. 로 딩 지연, 효율 이 높다 는 결론: 실제 개발 에서 이런 방식 을 추천 합 니 다.
7. 정적 내부 클래스 방식
public class StaticClassSingleton {
    //1.        
    private static volatile StaticClassSingleton instance;

    //2.     
    private StaticClassSingleton(){}

    //3.            
    private static class SingletonInstance{
        private static final StaticClassSingleton INSTANCE = new StaticClassSingleton();
    }

    //4.          
    public static synchronized StaticClassSingleton getInstance(){
        return SingletonInstance.INSTANCE;
    }
}

장단 점: 1. 클래스 로 딩 체 제 를 사용 하여 인 스 턴 스 를 초기 화 할 때 하나의 스 레 드 만 있 도록 합 니 다. 2. 정적 내부 류 는 클래스 로 딩 할 때 바로 예화 되 지 않 고 필요 할 때 만 방법 을 호출 하여 정적 내부 류 를 불 러 와 예화 합 니 다.3. 클래스 의 정적 속성 은 클래스 가 처음 불 러 올 때 만 초기 화 됩 니 다. JVM 은 스 레 드 의 안전성 을 확보 하 는 데 도움 을 줍 니 다. 클래스 가 초기 화 될 때 다른 스 레 드 는 들 어 갈 수 없습니다.결론: 스 레 드 안전, 로드 지연, 효율 이 높 습 니 다. 추천 합 니 다.
8. 매 거 방식
public enum  EnumSingleton {
    INSTANCE;
    public EnumSingleton getInstance(){
        return INSTANCE;
    }
}

장단 점: 1. 다 중 스 레 드 동기 화 문 제 를 피 할 수 있 고 반사 공격 을 피 할 수 있 으 며 반 직렬 화 를 방지 하여 새로운 대상 을 다시 만 들 수 있 습 니 다.결론: 추천 사용
3. 단일 모델 사용 시 주의사항
1. 단일 모드 는 메모리 에 하나의 대상 만 존재 하고 시스템 자원 을 절약 하 며 자주 소각 하 는 대상 을 만 들 때 단일 모드 를 사용 할 수 있 도록 합 니 다.
2. 하나의 종 류 를 예화 하려 면 new 가 아 닌 대상 을 얻 는 방법 을 사용 할 수 있 습 니 다.
3. 단일 모델 의 사용 장면: 도구 류, 데이터 베이스 소스, session 공장 등.

좋은 웹페이지 즐겨찾기