이학 단 례 모델

이학 단 례 모델
아이고!일례 로 모두 잘못 배 웠 는데, 무슨 배 울 것 이 있 느 냐?
오늘 '헤드 퍼스트 디자인 모드' 를 보고 디 테 일 한 부분 을 봤 기 때문에 단 례 를 재인 식 하기 로 했 습 니 다.
응용 장면
  • 스 레 드 탱크
  • 캐 시
  • 등록 표
  • 공장
  • 대화 상자
  • 선 호 설정

  • 일반적인 일례
    우리 먼저 보 자.
    public Single{
        private static Single singleInstance;
    	private Single(){}
        public static Single getSingleInstance(){
            if(singleInstance == null){
                singleInstance = new Single();
            }
            return singleInstance;
        }
    }
    

    아주 간단 한 예 입 니 다. 모두 가 쓰 고 구 조 를 숨 기 고 방법 을 폭로 합 니 다.
    그러나 이것 은 다 중 스 레 드 와 관련 된 것 입 니 다. 만약 에 제 가 두 스 레 드 가 동시에 도착 하면 if(singleInstance == null) 어떻게 합 니까? 이것 은 서로 다른 대상 이 나 올 것 입 니 다. 이것 은 안전 하지 않 습 니 다. 그러면 어떻게 합 니까?
    스 레 드 보안
    다 중 스 레 드 문 제 를 처리 하 는 데 우 리 는 세 가지 방법 이 있다.
    방법 1: new 를 앞 당 기 는 것 이 좋다.
    코드 가 구리다 고 생각 하지 마 세 요.
    public Single{
        private static Single singleInstance = new Single();
    	private Single(){}
        public static Single getSingleInstance(){
            return singleInstance;
        }
    }
    

    JVM 에서 이 클래스 를 불 러 오 면 바로 이 대상 을 만 들 수 있 습 니 다.만약 창설 과 운행 방면 에 있어 서 스트레스 가 크 지 않다 면, 너 는 또 급히 써 야 한다. 확실히 이렇게 할 수 있다
    방법 2: 동기 화 (synchronized) 블록 추가
    기억 나 세 요?
    public Single{
        private static Single singleInstance;
    	private Single(){}
        public static synchronized Single getSingleInstance(){
            if(singleInstance == null){
                singleInstance = new Single();
            }
            return singleInstance;
        }
    }
    

    방법 중간 에 synchronized 키 워드 를 더 하면 문 제 는 해결 되 었 습 니 다. 그러나 제 대상 이 모두 만 들 어 졌 다 면 저 는 바로 가 져 갈 수 있 습 니 다. 어디 에 두 고 기다 리 겠 습 니까?그래서 그 에 따 른 것 은 성능 의 재난 이다.
    방법 3: 동기 화 감소, 이중 잠 금 DCL 사용 (Double - Checked Lock)
    먼저 하나의 대상 이 만 들 어 졌 는 지, 만 들 지 않 았 는 지, 다시 동기 화 되 었 는 지 확인 하 십시오. 무작정 모두 동기 화 되 었 습 니 다.
    public Single{
        private volatile static Single singleInstance;
    	private Single(){}
        public static Single getSingleInstance(){
            if(singleInstance == null){
                synchronized(Single.class){
                    if(singleInstance == null){
                        singleInstance = new Single();
                    }
                }          
            }
            return singleInstance;
        }
    }
    

    이중 잠 금 메커니즘, 성능 이용
    단일 예 vs 전역 변수
    제 '2 학 static' 의 예 를 기억 하 십 니까?
    //Code.1
    public Single{
        static public void FuncA(Object o);
        static public void FuncB(Object o);
        static public void FuncC(Object o);
    }
    
    // Code.2
    public Single{
        private static Single singleInstance;
    	private Single(){}
        public static Single getSingleInstance(){
            if(singleInstance == null){
                singleInstance = new Single();
            }
            return singleInstance;
        }
        public void FuncA(Object o);
        public void FuncB(Object o);
        public void FuncC(Object o);
    }
    
    //     FuncA
    Object o = new Object();
    // call 1
    Single.FuncA(o);
    // call 2
    Single.getSingleInstance().FuncA(o);
    

    내 가 이전에 말 한 것 과 달리 초기 화 와 통제 권 이 다른 문제 도 존재 한다.
    초기 화
  • 단일 지연 초기 화
  • 클래스 로 딩 후 초기 화 시간 은 자바 프로그램
  • 통제 권
  • 단일 통제 권 은 우리 에 게 있다
  • 전역 변수 제어 권 은 자바
  • 좋은 웹페이지 즐겨찾기