자바-싱글 톤 단일 모드

글 목록
  • Java-Singleton 단일 모델
  • 소개
  • 주의
  • 용도
  • 간단 한 예
  • 기초 예시
  • 게으름뱅이 식(스 레 드 가 안전 하지 않 음)
  • 게으름뱅이 식(스 레 드 안전)
  • 굶 주 린 한식
  • 더 블 검색/이중 검사 잠 금(DCL,즉 double-checked locking)
  • 등록 식/정적 내부 류
  • 매 거
  • 관련 캐릭터
  • 요점
  • 구조 함수
  • 관련 디자인 모델
  • 응용 실례
  • 장점
  • 사용 장면
  • 코드
  • 자바-싱글 톤 단일 모드
    창조 형 모델
  • 1
  • “ ”

  • 간단 한 소개
    단일 모드 는 하나의 단일 클래스 와 관련 되 는데 이 클래스 는 자신의 대상 을 만 드 는 것 을 책임 지고 하나의 대상 만 생 성 되 는 것 을 확보한다.이 종 류 는 유일한 대상 을 방문 하 는 방식 을 제공 하여 직접 방문 할 수 있 으 며,이러한 대상 을 예화 할 필요 가 없다.
    주의 하 다.
  • 1.단일 사례 류 는 하나의 사례 만 있 을 수 있다.
  • 2,단일 클래스 는 자신 만 의 유일한 인 스 턴 스 를 만들어 야 합 니 다.
  • 3.단일 클래스 는 모든 다른 대상 에 게 이 인 스 턴 스 를 제공 해 야 합 니 다.

  • 쓸모
    인 스 턴 스 수 를 제어 하고 시스템 자원 을 절약 하려 고 할 때.전역 적 으로 사용 되 는 클래스 의 빈번 한 창설 과 소각 문 제 를 해결 할 수 있다.
    간단 한 예
    기초 예시
  • Singleton 류
  • public class SingleObject {
    
        /**
         *    SingleObject      
         */
        private static SingleObject instance = new SingleObject();
    
        /**
         *        private,           
         */
        private SingleObject(){}
    
        /**
         *          
         * @return
         */
        public static SingleObject getInstance(){
            return instance;
        }
    
        public void showMessage(){
            System.out.println("Hello World!");
        }
    
    }
    
  • 테스트 류
  • public class SingletonPatternDemo {
    
        public static void main(String[] args) {
            //        
            //     :     SingleObject()      
            //SingleObject object = new SingleObject();
    
            //         
            SingleObject object = SingleObject.getInstance();
    
            //    
            object.showMessage();
        }
    
    }
    
  • 운행 결과
  • Hello World!
    

    게으름뱅이 식(라인 이 안전 하지 않 음)
    Lazy 초기 화:다 중 스 레 드 보안 여부 。 synchronized, 。 이런 방식 은 lazy loading 이 뚜렷 하고 스 레 드 안전 을 요구 하지 않 으 며 에 있 습 니 다.
    public class Singleton {
    
        private static Singleton instance;
    
        private Singleton (){}
    
        public static Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    
    }
    

    게으름뱅이 식(스 레 드 안전)
    Lazy 초기 화:다 중 스 레 드 안전:이런 방식 으로 좋 은 lazy loading(게 으 름 로드)을 갖 추고 다 중 스 레 드 에서 좋 은 작업 을 할 수 있 지만 효율 이 낮 고 99%의 경우 동기 화 할 필요 가 없습니다.
  • 의 장점 은 첫 번 째 호출 에서 야 초기 화 되 어 메모리 낭 비 를 피한다.
  • 단점 은 반드시 잠 금 synchronized 를 추가 해 야 하나의 예 를 보장 할 수 있 지만 잠 금 을 추가 하면 효율 에 영향 을 줄 수 있다.
  • public class Singleton1 {
    
        private static Singleton1 instance;
    
        private Singleton1 (){}
    
        /**
         *       (              synchronized   )
         * @return
         */
        public static synchronized Singleton1 getInstance() {
            if (instance == null) {
                instance = new Singleton1();
            }
            return instance;
        }
    
    }
    

    굶 주 린 사람 식
    Lazy 초기 화:다 중 스 레 드 안전:이런 방식 이지 만 입 니 다.
  • 의 장점 은 자 물 쇠 를 채 우지 않 아 집행 효율 이 높아진다.
  • 단점 클래스 를 불 러 올 때 초기 화 되 어 메모 리 를 낭비 합 니 다.
  • classloader , ,instance , , getInstance , ( ) , instance lazy loading 。
    public class Singleton2 {
    	// instance          
        private static Singleton2 instance = new Singleton2();
        
        private Singleton2 (){}
        
        public static Singleton2 getInstance() {
            return instance;
        }
    
    }
    

    이중 검색/이중 검사 잠 금(DCL,즉 double-checked locking)
    JDK 버 전:1.5 기 Lazy 초기 화:다 중 스 레 드 보안:이러한 방식 으로 , 。 getInstance()의 성능 이 응용 프로그램 에 매우 중요 합 니 다.
    public class Singleton3 {
    
        /**
         * volatile                 ,                    
         */
        private volatile static Singleton3 Singleton3;
    
        private Singleton3 (){}
    
        public static Singleton3 getSingleton3() {
            if (Singleton3 == null) {
                /**
                 * synchronized                      。
                 */
                synchronized (Singleton3.class) {
                    if (Singleton3 == null) {
                        Singleton3 = new Singleton3();
                    }
                }
            }
            return Singleton3;
        }
    
    }
    

    등록 식/정적 내부 클래스
    Lazy 초기 화:다 중 스 레 드 보안 입 니 다. , 。 쌍 의 정적 도 메 인 사용 지연 초기 화 입 니 다.이중 잠 금 방식 이 아 닌 이 방식 을 사용 해 야 합 니 다.이 방식 은 정적 도 메 인 에 만 적 용 됩 니 다.더 블 잠 금 방식 은 인 스 턴 스 도 메 인 에서 초기 화 지연 이 필요 할 때 사용 할 수 있 습 니 다.이러한 방식 역시 classloader 체 제 를 이용 하여 intance 를 초기 화 할 때 하나의 스 레 드 만 있 도록 합 니 다. 번 째 방식 과 달리 방식 은 Singleton 류 가 불 러 오 면 intance 는 정례 화 됩 니 다(lazy loading 효과 에 이 르 지 못 함).이런 방식 은 Singleton 류 가 불 러 옵 니 다.instance 가 반드시 초기 화 되 는 것 은 아 닙 니 다.Singleton Holder 클래스 가 주동 적 으로 사용 되 지 않 았 기 때문에 getInstance 방법 을 명시 적 으로 호출 할 때 만 Singleton Holder 클래스 를 명시 적 으로 불 러 와 인 스 턴 스 를 예화 할 수 있 습 니 다.실례 화 인 스 턴 스 가 자원 을 소모 하기 때문에 로 딩 을 지연 시 키 고 싶 습 니 다.다른 한편,Singleton 류 로 딩 할 때 실례 화 하 는 것 을 원 하지 않 습 니 다.Singleton 류 가 다른 곳 에서 주동 적 으로 사용 되 어 로 딩 될 수 있다 는 것 을 확보 하지 못 하기 때문에 이 럴 때 실례 화 인 스 턴 스 는 적절 하지 않 습 니 다.이때 이런 방식 은 방식 에 비해 매우 합리적이다.
    public class Singleton4 {
        
        private static class Singleton4Holder {
            private static final Singleton4 INSTANCE = new Singleton4();
        }
        
        private Singleton4 (){}
    
        /**
         *  Singleton   ,      INSTANCE,       getInstance() ,       。
         * @return
         */
        public static final Singleton4 getInstance() {
            return Singleton4Holder.INSTANCE;
        }
    }
    

    매 거
    Lazy 초기 화:다 중 스 레 드 안전 여부: [runoob ] 입 니 다.그것 은 더욱 간결 하고 직렬 화 체 제 를 자동 으로 지원 하 며 여러 번 의 정례 화 를 절대적 으로 방지한다.이런 방식 은 Effective Java 작가 Josh Bloch 가 제창 하 는 방식 으로 , , , 。 이지 만 JDK 1.5 이후 에 야 enum 특성 을 넣 었 기 때문에 이런 방식 으로 쓰 는 것 은 생소 하고 실제 업무 에서 도 거의 사용 되 지 않 는 다.reflection attack 을 통 해 개인 구조 방법 을 사용 할 수 없습니다.
    public enum Singleton5 {
        
        INSTANCE;
        
        public void whateverMethod() {
            
        }
    }
    
    : , , 。 lazy loading , 。 , 。 , 。
    관련 된 역할
  • 싱글 턴 단일 모델 중 싱글 턴 만 캐릭터 가 있다.싱글 톤 캐릭터 중 유일한 인 스 턴 스 를 되 돌려 주 는 static 이 있 습 니 다.이 방법 은 항상 실례 를 되 돌려 준다.

  • 요점
    구조 함수
    구조 함 수 는 반드시 사유 가 되 어야 한다.
    관련 디자인 모델
  • AbstractFactory 추상 공장 모델
  • Builder 건설 자 모델
  • Facade 외관 모델
  • Prototype 원형 모델
  • 응용 실례
  • 한 반 에 담임 선생님 이 한 명 밖 에 없습니다.
  • 다 중 프로 세 스 다 중 스 레 드 환경 에서 여러 프로 세 스 나 스 레 드 가 같은 파일 을 조작 하 는 현상 이 나타 나 면 모든 파일 처 리 는 유일한 인 스 턴 스 를 통 해 이 루어 져 야 합 니 다.
  • 일부 장치 관리 자 는 보통 하나의 예 모드 로 설정 된다.예 를 들 어 한 컴퓨터 에 프린터 가 두 대 있 고 출력 할 때 처리 해 야 하 며 두 대의 프린터 가 같은 파일 을 인쇄 할 수 없다.
  • 배 고 파 서 밥 을 먹 어야 하 는 것 도 하나의 예 입 니 다.서로 다른 요리 의 식당 은 제 가 배 를 채 우 는 수 요 를 만족 시 킬 수 있 습 니 다.정말 식당 에 들 어가 서 밥 을 먹 으 면 여러 식당 에 가서 소 비 를 해서 배 를 채 울 수 없습니다.

  • 장점.
  • 1.메모 리 는 하나의 인 스 턴 스 만 있 고 메모리 비용 을 줄 이 며 특히 인 스 턴 스 를 자주 만 들 고 소각 합 니 다(예 를 들 어 페이지 캐 시).
  • 2.자원 에 대한 다 중 점용 을 피한다(예 를 들 어 파일 쓰기 작업).

  • 필드 사용
  • 1.유일한 일련 번 호 를 생산 해 야 합 니 다.
  • 2,WEB 의 계수 기 는 새로 고침 할 때마다 데이터베이스 에 한 번 씩 추가 하지 않 고 단일 사례 로 먼저 캐 시 합 니 다.
  • 3.만 든 대상 이 소모 해 야 할 자원 이 너무 많 습 니 다.예 를 들 어 I/O 와 데이터 뱅 크 의 연결 등 입 니 다.
  • :getInstance() synchronized (Singleton.class) instance 。
    코드
    GitHub-Singleton 단일 모드

    좋은 웹페이지 즐겨찾기