Day5 - 단일 예제

3859 단어

단일 예제 정보

  • 목적: 대상의 유일성을 보증하는
  • 핵심: 구조 방법의 사유(이 점은 Fragment가 요구하는 구조 방법과public 충돌이 필요하다)
  • 사양
  • 단일 객체만
  • 단일 인스턴스 내부 객체 만들기
  • 단일 사례로 다른 대상에게 이 대상을
  • 제공
  • 의 이점
  • 메모리에는 하나의 실례만 있어 메모리 비용을 줄인다. 예를 들어 빈번한 창설과 소각 실례
  • 리소스에 대한 다중 응용(예: 파일 쓰기) 방지

  • 게으름뱅이

  • 단점: 여러 라인이 호출되면 여러 개의 실례를 만들 수 있습니다
  • public class Singleton {
      private static Singleton instance;
      private Singleton (){}
      public static Singleton getInstance() {
        if (instance == null) {
         instance = new Singleton();
        }
        return instance;
      }
    }
    

    게으름뱅이

  • 장점: 잠금 방법
  • 단점: 하나의 라인 창설 대상만 있어 효율적이지 않다.잠금 장치는 효율이 낮아 한 번에
  • public class Singleton {  
      private static Singleton instance;  
      private Singleton (){}  
      public static synchronized Singleton getInstance() {
        if (instance == null) {
          instance = new Singleton();
        }
        return instance;
      }
    }
    

    이중 검사 자물쇠

  • 장점: 코드 블록을 잠그고 판단하고 자물쇠를 열고
  • 첫 번째if는 존재하면 창설하지 않고 효율을 높인다는 것을 보증한다
  • 두 번째if는 여러 개의 라인이 함께 들어오는 것을 방지하고 여러 개의 실례를 생성합니다
  • 단점: instance = new Singleton()은 원자 조작이 아니라 다음과 같이 분해할 수 있다.
  • instance에 메모리 할당
  • 은singleton의 구조 함수를 호출하여 구성원 변수
  • 을 초기화합니다
  • 할당된 메모리 공간에 instance 객체 지향
  • jvm의 실시간 컴파일러는 명령 재배열 최적화가 존재하는데 실행 순서는 1-2-3 또는 1-3-2,
  • 일 수 있습니다.
    public class Singleton {  
      private static Singleton instance;  
      private Singleton (){}  
      public static Singleton getSingleton() {
        if (instance == null) {                         //Single Checked, 
          synchronized (Singleton.class) {
            if (instance == null) {                 //Double Checked
                instance = new Singleton();
            }
          }
        }
        return instance ;
      }
    }
    

    이중 검사 잠금 최적화

  • 은volatile을 사용했습니다. 왜냐하면 명령의 정렬 최적화를 금지했기 때문입니다. 가시성이 아니라 (루트가 로컬에 instance의 복사본을 저장하지 않고 매번 메인 메모리에서 읽지 않도록 보장합니다)
  • 단점:java5 이전 JMM(Java 메모리 모델)이 완벽하지 않아volatile의 차단 재배열
  • 을 보장할 수 없음
    public class Singleton {
        private volatile static Singleton instance; //  volatile
        private Singleton (){}
        public static Singleton getSingleton() {
            if (instance == null) {                     
                synchronized (Singleton.class) {
                    if (instance == null) {       
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    
    }
    

    아사자식 static final field

  • 단점: 불러오기를 게을리 하는 것이 아니라 불러오기 클래스가 처음부터 실례화되어 클라이언트가 getInstance () 방법을 호출하지 않아도 외부 파라미터에 의존해야 한다면
  • 을 사용할 수 없습니다
    public class Singleton{
      private static final Singleton instance = new Singleton();
      private Singleton(){};
      public static Singleton getInstance(){
        return instance;
      }
    }
    

    정적 내부 클래스 static nested class

  • Singleton Holder는 개인 소유로 외부에 접근할 수 없습니다. 게으름뱅이
  • JDK 버전
  • 에 의존하지 않음
  • 인스턴스를 읽는 동안 동기화되지 않음
  • 성능 결함 없음
    public class Singleton{
      private static class SingletonHolder{
        private static final Singleton INSTANCE = new instance();
      }
      private Singleton(){};
      public static final Singleton getInstance(){
        return SingletonHolder.INSTANCE;
      }
    }
    

    매거

    public enum EasySingleton{
        INSTANCE;
    }
    

    총결산

  • 단일 사례는 5가지, 굶주림식, 게으름뱅이식, 이중 검사 자물쇠, 정적 내부류, 매거
  • 은 보통 아사자식을 사용한다.게으름을 피우면 정적 내부류를 명확히 한다.역서열화 창설 대상은 매거
  • 을 사용합니다

    PS

  • 더미에 new로 만든 그룹을 저장하고 대상
  • 창고 내 저장 변수, 수조, 대상의 인용(첫 주소)
  • GC는 메모리의 데이터를 회수하고 메모리의 인용은 프로그램이 코드 블록 역할 영역 밖으로 실행될 때 자동으로
  • 을 방출한다
    참고 자료
  • 어떻게 단례 모드를 정확하게 쓰는가
  • 채소새 강좌 | 단일 모드
  • 자바 중량 메모리와 창고 메모리 설명
  • 좋은 웹페이지 즐겨찾기