너 진짜 단일 모드 쓸 줄 알 아?

전재 출처 를 밝 혀 주 십시오:http://tedyin.me/2016/03/13/singlton-pattern/
오늘 소개 해 드 리 겠 습 니 다 . 바로 이 등 판 률 이 매우 높 은 모델 입 니 다. 프로그래머 가 기본적으로 그 를 사용 해 본 적 이 있 고 사용 해 본 적 이 없어 서 적어도 그 를 알 고 있 습 니 다.근 데 우리 진짜 알 아?
단일 모델 의 일반적인 실현 방식 은 다음 과 같은 두 가지 로 나 뉜 다.
굶 주 린 사람 식
public class Singleton{
    private static Singleton instance = new Singleton();
    private Singleton(){}
    public static Singleton newInstance(){
        return instance;
    }
    public void doSomething(){
        // Do something ...
     }
}
는 가장 간단 한 실현 방식 이다. 이런 실현 방식 은 초기 화 할 때 한 가지 예 를 사용 해 야 하 는 상황 에 적합 하 다. 이런 방식 은 간단 하고 거 칠 며 한 가지 예 로 초기 화 되 지 않 으 면 매우 빠 르 고 메모리 가 매우 어 릴 때 이런 방식 이 적당 하 다. 응용 프로그램 이 시 작 될 때 직접 불 러 오고 초기 화 하 는 것 이 적당 하 다.그러나 만약 에 한 번 의 초기 화 작업 이 비교적 오래 걸 리 고 응용 이 시작 속도 에 대한 요구 가 있 거나 한 번 의 점용 메모리 가 비교적 크 거나 한 번 의 사례 가 특정한 장면 에서 만 사용 되 는 경우 가 있 으 며 일반적인 상황 에서 사용 하지 않 을 때 의 단일 모델 을 사용 하 는 것 은 적절 하지 않다. 이 럴 때 사용 해 야 한다 .필요 에 따라 로드 를 지연 시 키 는 방식 입 니 다.
게으름뱅이 식
public class Singleton{
    private static Singleton instance = null;    
    private Singleton(){}
    public static newInstance(){
        if(null == instance){
            instance = new Singleton();
        }
        return instance;
    }
    public void doSomething(){
        // Do something ...
    }
}
의 가장 큰 차 이 는 하나의 초기 화 작업 을 필요 할 때 까지 지연 시 키 는 것 이다. 이렇게 하 는 것 은 어떤 상황 에서 큰 도움 이 된다.예 를 들 어 특정한 사례 에서 사용 하 는 횟수 가 많 지 않 지만 이 사례 가 제공 하 는 기능 은 매우 복잡 하고 로드 와 초기 화 는 대량의 자원 을 소모 해 야 한다. 이때 사용 하 는 것 이 좋 은 선택 이다.
다 중 스 레 드 에서 의 단일 예 모드
위 에서 일부 사례 모델 의 기본 적 인 응용 방법 을 소개 했다. 그러나 위 에서 말 한 사용 방식 은 모두 은밀 한 전제 가 있다. 그것 은 바로 그들 이 모두 단일 스 레 드 조건 에서 다 중 스 레 드 로 바 뀌 면 오류 가 발생 할 위험 이 있다 는 것 이다.다 중 스 레 드 의 경우 문제 가 발생 하지 않 습 니 다. JVM 은 단리 류 를 한 번 만 불 러 올 수 있 지만 단리 대상 을 중복 생 성 하 는 문제 가 발생 할 수 있 습 니 다.왜 이런 문제 가 생 겼 을 까? 단일 예 를 만 들 때 스 레 드 가 안전 하지 않 기 때문에 여러 스 레 드 가 동시에 그의 newInstance 방법 을 호출 할 수 있 기 때문에 여러 스 레 드 가 같은 단일 예 를 만 들 수 있 습 니 다. 의 단리 모델 도 스 레 드 가 안전 하도록 할 방법 이 있 습 니까?답 은 분명히 있 을 것 이다. 사람들 은 보통 동기 화 자 물 쇠 를 넣 는 방식 으로 실현 하지만 이렇게 실현 하 는 것 은 비교적 번거롭다.그렇다면 더 좋 은 실현 방법 은 없 을 까?이 문 제 를 물 을 수 있다 면 반드시 있어 야 한다. 그렇지 않 으 면 체면 을 세 워 야 한다.우 리 는 JVM 의 클래스 로드 체 제 를 이용 하여 실현 할 수 있다.많은 상황 에서 JVM 은 우리 에 게 동기 화 통 제 를 제공 했다. 예 를 들 어:
  • 블록 에서 초기 화 된 데이터
  • 필드 방문 static{}
  • ...
  • 등등
  • JVM 에서 클래스 로 딩 을 할 때 데이터 가 동기 화 되 는 것 을 보증 하기 때문에 우 리 는 이렇게 실현 할 수 있 습 니 다.
    내부 클래스 를 사용 하여 이 내부 클래스 에서 대상 인 스 턴 스 를 만 듭 니 다.이렇게 되면 응용 프로그램 에서 내부 클래스 JVM 을 사용 하지 않 으 면 이 단일 클래스 를 불 러 오지 않 고 단일 대상 을 만 들 지 않 아 final 의 지연 로드 와 스 레 드 안전 을 실현 합 니 다.
    구현 코드 는 다음 과 같 습 니 다:
    public class Singleton{
        //   ,                 
        private static class SingletonHolder{
            public static Singleton instance = new Singleton();
        }
    
        private Singleton(){}
    
        public static Singleton newInstance(){
            return SingletonHolder.instance;
        }
    
        public void doSomething(){
            //do something
        }
    }
    

    이렇게 실 현 된 단일 사례 는 바로 스 레 드 가 안전 하 다 는 것 이다. 마 마 는 더 이상 나의 단일 사례 가 단일 사례 가 아니 라 는 것 을 걱정 할 필요 가 없다.
    매 거 진 을 사용 하여 단일 모드 를 실현 하 다.
    상기 한 사례 모델 의 실현 방식 을 제외 하고 우 리 는 매 거 진 유형 을 통 해 단리 모델 을 실현 할 수 있다. 이것 도 에서 추천 하 는 방식 이다.
    매 거 진 형식 을 사용 하여 단일 모드 를 다음 과 같이 실현 합 니 다.
    public enum Singleton{
        //         ,   Singleton     
        instance;
    
        public void doSomething(){
            // do something ...
        }    
    }
    

    매 거 진 으로 이 루 는 게 더 쉽 지 않 을까요?매 거 방식 으로 이 루어 진 단일 모델 도 스 레 드 가 안전 하기 때문에 다 중 스 레 드 문 제 를 걱정 하지 않 고 대담 하 게 사용 할 수 있 습 니 다.
    이상 은 단일 모드 의 사용 입 니 다. 지금 은 완전히 말 할 수 있 습 니 다. 당신 은 정말 단일 모드 를 사용 할 줄 압 니 다.

    좋은 웹페이지 즐겨찾기