자바 에서 전면적 인 단일 모델 의 다양한 실현 방식 을 분석 하 다.

1.단일 모델 의 사상
자바 병발 에 관 한 지식 을 정리 하려 면 어디서부터 시작 해 야 할 지 모 르 겠 습 니 다.단일 모드 에서 고려 해 야 할 스 레 드 안전 이 생각 나 면 단일 모드 부터 시작 하 세 요.예전 에 단일 사례 모델 을 쓴 적 이 있 는데 여기 서 다시 모 아서 보충 하고 정리 한 다음 에 단일 사례 모델 의 여러 가지 실현.
단일 모델 의 주요 사상 은:
  • 구조 방법 을 민영화(private 로 성명)하면 외부 에서 새로운 인 스 턴 스 대상 을 마음대로 내 놓 을 수 없다.
  • 외부 에서 사용 할 수 있 도록 개인 적 인 정적 인 사례 대상 을 설명 합 니 다.
  • 외부 에서 이러한 사례 대상 을 얻 을 수 있 도록 공개 적 인 방법 을 제공 합 니 다
  • 이런 견 해 는 보기 에는 맞 는 것 같 지만,그다지 정확 하지 않 은 것 같다.사실 외부 에서 새로운 인 스 턴 스 대상 을 마음대로 내 놓 을 수 있 더 라 도 우리 가 매번 사용 하 는 대상 이 유일한 것 이 라 고 보장 하면 된다.
    2.단일 모드 의 N 가지 실현 방식
    2.1.굶 주 린 사람 식(스 레 드 안전,사용 가능)
    
    public class Singleton {
        private Singleton() {
        }
    
        private static Singleton sSingleton = new Singleton();
    
        public static Singleton getInstance() {
            return sSingleton;
        }
    }
  • 단점:클래스 를 불 러 올 때 실례 화하 여 시스템 자원 을 미리 점용 했다.
  • 2.2 상수 식(스 레 드 안전,사용 가능)
    
    public class Singleton {
        private Singleton() {
        }
    
        public static final Singleton sSingleton = new Singleton();
    }
    인 스 턴 스 대상 을public static final로 수식 하고 공개 적 인 방법 으로 인 스 턴 스 를 얻 지 않 으 며 직접Singleton.sSingleton를 통 해 얻 을 수 있 습 니 다.
  • 단점:굶 주 린 한식 과 마찬가지 로 클래스 를 불 러 올 때 실례 화하 여 시스템 자원 을 미리 점용 했다.
  • 2.3.게으름뱅이 식(라인 이 안전 하지 않 고 동시 다발 장면 사용 불가)
    
    public class Singleton {
        private Singleton() {
        }
    
        private static Singleton sSingleton;
    
        public static Singleton getInstance() {
            if (sSingleton == null) {
                sSingleton = new Singleton();
            }
            return sSingleton;
        }
    }
  • 단점:첫 번 째 로 딩 시 반응 이 느 리 고 스 레 드 가 안전 하지 않 습 니 다.
  • 2.4 동기 화 된 게으름뱅이 식?(스 레 드 안전,사용 가능,사용 권장 하지 않 음)
    
    public class Singleton {
        private Singleton() {
        }
    
        private static Singleton sSingleton;
    
        public synchronized static Singleton getInstance() {
            if (sSingleton == null) {
                sSingleton = new Singleton();
            }
            return sSingleton;
        }
    }
  • 단점:첫 번 째 로 딩 시 반응 이 약간 느 리 고 매번 호출getInstance이 동기 화 되 어 불필요 한 동기 화 비용 을 초래 합 니 다.이런 모델 은 일반적으로 사용 하 는 것 을 권장 하지 않 습 니 다.
  • 2.5.이중 검사 잠 금 DCL(스 레 드 안전,대부분 장면 만족,추천 사용)
    
    public class Singleton {
        private Singleton() {
        }
    
        /**
         * volatile is since JDK5
         */
        private static volatile Singleton sSingleton;
    
        public static Singleton getInstance() {
            if (sSingleton == null) {
                synchronized (Singleton.class) {
                    //     ,   instance  
                    if (sSingleton == null) {
                        sSingleton = new Singleton();
                    }
                }
            }
            return sSingleton;
        }
    }
    sSingleton=new Singleton()은 원자 조작 이 아 닙 니 다.(XXX)그러므로volatile키 워드 를 추가 해 야 합 니 다.이 키 워드 는 jdk 1.5 이후 버 전에 있 습 니 다.
  • 장점:자원 이 용 률 이 높 고 getInstance 를 처음 실행 할 때 단일 대상 이 실례 화 되 고 효율 이 높다.
  • 단점:처음 불 러 올 때 반응 이 느 리 고 자바 메모리 모델 로 인해 가끔 실패 할 수 있 습 니 다.높 은 병발 환경 에서 도 어느 정도 결함 이 있 는데,발생 할 확률 은 매우 낮 지만.DCL 모델 은 가장 많이 사용 하 는 단일 사례 실현 방식 으로 필요 할 때 만 단일 사례 대상 을 예화 할 수 있 고 절대 다수의 장면 에서 단일 대상 의 유일 성 을 확보 할 수 있다.코드 가 동시 다발 장면 이 비교적 복잡 하거나 jdk 1.6 버 전에 서 사용 하지 않 으 면 이런 방식 은 보통 수 요 를 만족 시 킬 수 있다.
  • 2.6.정적 내부 클래스(스 레 드 안전,추천)
    
    public class Singleton {
    
        private Singleton () {
        }
    
        private static class InnerClassSingleton {
         private final static Singleton sSingleton = new Singleton();
        }
    
        public static Singleton getInstance() {
            return InnerClassSingleton.sSingleton;
        }
    }
    장점:추천 사용.
    2.7.매 거 진 사례(스 레 드 안전,사용 권장 하지 않 음)
    
    public enum Singleton{
        INSTANCE;
        
        //     
        public void doSomething(){
            ...
        }
    }
  • 장점:매 거 진 실현 사례 는 간단 하고 안전 하 다.
  • 단점:경험 이 풍부 한 안 드 로 이 드 개발 자 들 은 매 거 진 사용 을 최대한 피한다.공식 문서 에 따 르 면 정적 상수 인 Enum 에 비해 두 배 이상 의 메모 리 를 사용 합 니 다.
  • 2.8 다른 유형의 실현―용 기 를 이용 하여 단 례 를 실현 한다.
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class Singleton {
        private static Map<String, Object> objMap = new HashMap<String, Object>();
    
        private Singleton() {
        }
    
        public static void registerService(String key, Object instance) {
            if (!objMap.containsKey(key)) {
                objMap.put(key, instance);
            }
        }
    
        public static Object getService(String key) {
            return objMap.get(key);
        }
    }
    HashMap 용기 key 의 중복 되 지 않 는 특성 을 이용 하 였 습 니 다.
  • 장점:이런 실현 방식 으로 인해 우 리 는 다양한 유형의 단일 사례 를 관리 할 수 있 고 사용 할 때 통 일 된 인 터 페 이 스 를 통 해 조작 을 할 수 있 으 며 사용자 의 사용 원 가 를 낮 출 수 있 으 며 사용자 에 게 구체 적 인 실현 을 숨 기 고 결합 도 를 낮 출 수 있다.
  • 단점:민영화 구조 방법 이 없 으 면 사용 자 는 새로운 인 스 턴 스 대상 을 만 들 수 있다.
  • 2.9 반사 파괴 방지 사례
    앞의 여러 가지 실현 방법 중에서 우 리 는 구조 방법 에 따라 사유 화 된 사상 으로 이 루어 진 것 이 많다.우 리 는 반 사 를 이용 하여 새로운 대상 을 만 들 수 있다 는 것 을 알 고 있다.그러면 반사 장면 에서 이런 사상 이 실현 하 는 단일 모델 은 효력 을 잃 는 다.그러면 어떻게 반사 파괴 단일 모델 을 방지 할 수 있 습 니까?원 리 는 하나의 실례 가 존재 하 는 상황 에서 구조 방법 을 다시 호출 할 때 이상 을 던 지 는 것 이다.다음은 정적 내부 클래스 의 단일 예 모드 를 예 로 들 면:
    
    public class Singleton {
        private static boolean flag = false;  
      
        private Singleton(){  
            synchronized(Singleton.class)  
            {  
                if(flag == false)  
                {  
                    flag = !flag;  
                }  
                else  
                {  
                    throw new RuntimeException("       !");  
                }  
            }  
        }  
    
        private static class InnerClassSingleton {
         private final static Singleton sSingleton = new Singleton();
        }
    
        public static Singleton getInstance() {
            return InnerClassSingleton.sSingleton;
        }
    }
    2.10.직렬 화 와 반 직렬 화 파괴 사례 를 방지한다.
    직렬 화 를 통 해 하나의 대상 인 스 턴 스 를 디스크 에 기록 하고 반 직렬 화 를 통 해 다시 읽 을 때 구조 방법 이 개인 적 이 더 라 도 특수 한 경 로 를 통 해 새로운 인 스 턴 스 를 만 들 수 있 으 며 이러한 구조 함 수 를 호출 하 는 것 과 같다.이 문 제 를 피 하려 면 코드 에 다음 과 같은 방법 을 추가 하여 역 직렬 화 과정 에서 readResolve 방법 을 실행 할 때 sSingleton 대상 으로 돌아 가게 해 야 합 니 다.
    
    private Object readResolve() throws ObjectStreamException {
        return sSingleton;
    }
    결어
    어떤 상황 에서 도 하나의 사례 로 이 루어 지 는 방식 이 있 습 니까?
    있다위 에서 말 한 매 거 일례 다.매 거 를 통 해 모든 상황 에서 하나의 사례 이 고 스 레 드 가 안전 하 다 는 것 을 보증 할 수 있다.
    이상 은 자바 에서 전면적 인 단일 모델 의 다양한 실현 방식 에 대한 상세 한 내용 을 분석 하 는 것 입 니 다.자바 단일 모델 의 실현 방식 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 시기 바 랍 니 다!

    좋은 웹페이지 즐겨찾기