싱글 톤 모드 구현

4222 단어
제목: 한 가지 유형 을 디자인 하면 우 리 는 이런 사례 의 문 제 를 만 들 수 밖 에 없다. 사실은 흔히 볼 수 있 는 단일 모델 일 뿐 이 고 여러분 들 이 이 가장 기본 적 인 디자인 모델 에 대해 이미 알 고 있 을 것 이 라 고 믿 습 니 다.
해법 1 (좋 지 않 습 니 다. 단일 스 레 드 환경 에 만 적 용 됩 니 다)
public class Singleton { 
 private Singleton {} 
 private static Singleton instance = null;
 public static Singleton getInstance() { 
   if (instance == null) { 
     instance = new Singleton();
    } 
   return instance;
  }
} 

여기에 쓰 인 것 은 전형 적 인 게으름뱅이 식 단 례 이 고 굶 주 린 한식 의 단 례 모델 도 있 는데 아래 에서 소개 할 것 이다.이런 표기 법 이 좋 지 않 은 이 유 는 다 중 스 레 드 환경 에서 사용 할 수 없 기 때문이다.생각해 보 세 요. 이때 두 개의 스 레 드 가 있 습 니 다. 스 레 드 1 과 스 레 드 2. 그 중에서 스 레 드 1 이 if (instance == null) 라 는 문 구 를 실 행 했 습 니 다. 이때 스 레 드 2 가 집행 권 을 빼 앗 고 계속 실행 하면 스 레 드 1 도 계속 기 다 려 야 합 니 다.스 레 드 2 가 실 행 된 후에 Singleton 대상 을 되 돌려 준 후에 스 레 드 1 은 instance = new Singleton(); 이 문 구 를 시작 으로 실 행 됩 니 다. 그래서 스 레 드 2 에서 대상 을 만 든 후에 스 레 드 1 도 대상 을 만 들 었 습 니 다.따라서 한 대상 만 만 들 겠 다 는 요 구 는 여기 서 이 루어 질 수 없다.
해법 2 (다 중 스 레 드 환경 에서 일 할 수 있 지만 효율 이 높 지 않다)
해법 1 의 실 패 는 주로 다 중 스 레 드 의 상황 을 고려 하지 않 았 기 때문에 이런 상황 에 대한 가장 직접적인 해결 방법 은 문제 가 발생 할 수 있 는 곳 에 동기 코드 를 추가 하 는 것 이 빠르다 는 것 이다.
public class Singleton { 
  private Singleton {} 
  private static Singleton instance = null; 
  public static Singleton getInstance() { 
    synchronized (Singleton.class) { 
      if (instance == null) { 
        instance = new Singleton(); 
      } 
    } 
    return instance; 
  } 
}

현재 이 코드 는 다 중 스 레 드 의 경우 유일한 인 스 턴 스 만 만 만 들 수 있 고 우리 가 해법 1 에서 만난 문 제 를 성공 적 으로 해결 할 수 있 습 니 다.그러나 잠 금 은 프로그램 에 시간 이 많이 걸 리 는 작업 이다.그리고 우 리 는 이 코드 에서 어떤 상황 에서 든 하나의 스 레 드 가 싱글 톤 대상 을 만 들 려 고 할 때 마지막 잠 금 이 필요 하 다 는 것 을 알 게 되 었 다.프로그램의 운영 효율 을 크게 떨 어 뜨 렸 기 때문에 개선 이 필요 하 다.
해법 3 (동기 잠 금 전후 두 번 추가 하여 인 스 턴 스 가 이미 존재 하 는 지 판단)
해법 2 중 코드 에 대한 분석 을 통 해 알 수 있 듯 이 실제 다음 코드 는 인 스 턴 스 가 만 들 지 않 았 을 때 만 실행 하면 된다.
synchronized (Singleton.class) { 
  if (instance == null) { 
    instance = new Singleton(); 
  } 
} 

따라서 인 스 턴 스 가 생 성 된 상황 에서 특정한 스 레 드 가 인 스 턴 스 를 가 져 오 려 고 할 때 이 동기 코드 블록 을 실행 하 는 것 을 피하 기 위해 우 리 는 알 고 있 습 니 다.
public class Singleton { 
  private Singleton {} 
  private static Singleton instance = null; 
  public static Singleton getInstance() { 
    if (instance == null) {
      synchronized (Singleton.class) { 
        if (instance == null) { 
          instance = new Singleton(); 
        } 
      } 
    }
    return instance; 
  } 
}

위의 이 코드 는 해법 2 의 동기 코드 블록 외 에 인 스 턴 스 가 이미 존재 하 는 지 에 대한 판단 을 추가 했다.이러한 방법 을 통 해 인 스 턴 스 가 생 성 된 상황 에서 모든 스 레 드 는 실행 과정 에서 동기 화 코드 를 실행 하지 않 기 때문에 해법 2 를 바탕 으로 프로그램의 운행 효율 을 크게 향상 시 켰 다.
해법 4 (굶 주 린 한식 해결 라인 문제)
해법 3 은 충분 해 보이 지만 코드 내용 이 길다.그렇다면 동기 화하 지 않 고 다 중 스 레 드 상황 에서 단일 모델 을 실현 할 수 있 는 방법 은 없 을 까?굶 주 린 한식 단일 모델 이 바로 이 문제 의 답안 이다.
public class Singleton {
  private Singleton() {}
  private static Singleton instance = new Singleton;
  public static Singleton getInstance() {
    return instance;
  }
}

굶 주 린 한식 단일 사례 모델 은 위의 세 가지 해법 이 둘러싸 인 라인 안전 문 제 를 교묘 하 게 피 했다.그러나 주의해 야 할 것 은 인 스 턴 스 instance 는 첫 번 째 호출 Singleton.getInstance() 때 만 든 것 이 아니 라 프로그램 에서 처음 사용 Singleton 할 때 만 든 것 이다.만약 에 우리 가 위의 코드 에 단일 요구 와 무관 한 정적 함 수 를 삽입 한다 고 가정 하면 우리 가 이 정적 함 수 를 사용 할 때 Singleton 인 스 턴 스 를 만 들 지 않 았 지만 굶 주 린 한 식 단일 예 는 우리 에 게 너무 일찍 인 스 턴 스 를 만들어 메모리 의 사용 효율 을 낮 출 것 이다.
해법 5 (필요 에 따라 인 스 턴 스 생 성 실현)
해법 4 에 대하 여 이곳 의 해법 5 는 이 문 제 를 잘 해결 하 였 다.
public class Singleton {
  private Singleton() {}
  public static Singleton getInstance() {
    return Nested.instance;
  }
  
  private static class Nested {
    static Singleton instance = new Singleton();
  }
}

이 코드 에서 우 리 는 Singleton 에서 개인 유형 Nested 을 정 의 했 는데 이 유형 은 호출 Singleton.getInstance() 할 때 만 호출 된다.우 리 는 Nested 유형 을 private 유형 으로 정의 하기 때문에 다른 종 류 는 Nested 유형 을 호출 할 수 없습니다.따라서 Singleton 인 스 턴 스 는 그 어떠한 상황 에서 도 우리 가 호출 Singleton.getInstance() 할 때 만 만들어 집 니 다. 최종 적 으로 법 4 중의 미리 인 스 턴 스 를 만 드 는 문 제 를 잘 해결 하고 필요 에 따라 만 들 었 습 니 다.

좋은 웹페이지 즐겨찾기