자바 단일 모드 의 지식 점 상세 설명

6269 단어 Java단일 모드
게으름뱅이 모드 와 굶 주 린 남자 모드
게으름뱅이 모드 는 게 으 른 로드 입 니 다.사용 할 때 로드 하 는 것 입 니 다.스 레 드 안전 문제 가 존재 하 므 로 수 동 으로 잠 금 제어 가 필요 합 니 다.그것 의 장점 은 클래스 로 딩 속도 가 비교적 빠 르 고 필요 에 따라 로 딩 하여 자원 을 절약 하 는 것 이다.
굶 주 린 모드 는 클래스 를 불 러 올 때 인 스 턴 스 를 만 드 는 것 입 니 다.그것 은 천성적으로 라인 안전 문제 가 존재 하지 않 는 다.그러나 클래스 로드 의 속도 가 느 려 지고 자원 이 소모 된다.
게으름뱅이 모드-단일 검사
예제 코드 는 다음 과 같다.

public class LazySingleton {

  private static LazySingleton singletoninstance = null;
  private Object data = new Object();

//       
  private LazySingleton(){

  }
//    
  public static synchronized LazySingleton getInstance(){

    if(singletoninstance == null){
      singletoninstance = new LazySingleton();
    }
    return singletoninstance;
  }

  public Object getData() {
    return data;
  }

  public void setData(Object data) {
    this.data = data;
  }
}
테스트 코드 는 다음 과 같 습 니 다:

public class TestThread extends Thread {

  @Override
  public void run() {

    LazySingleton instance = LazySingleton.getInstance();
    System.out.println(instance.getData());
  }
}

public static void main(String[] args) {

    for(int i =0;i < 10;i++){
      TestThread t = new TestThread();
      t.start();
    }
  }
}
실행 결 과 는 다음 과 같 습 니 다.
java.lang.Object@306d3b64
java.lang.Object@306d3b64
java.lang.Object@306d3b64
java.lang.Object@306d3b64
java.lang.Object@306d3b64
java.lang.Object@306d3b64
java.lang.Object@306d3b64
java.lang.Object@306d3b64
java.lang.Object@306d3b64
java.lang.Object@306d3b64
같은 object 대상 을 출력 하여 같은 Lazy Singleton 대상 에서 얻 은 데 이 터 를 표시 합 니 다.
그러나 상기 코드 에 현저 한 문제 가 존재 합 니 다.여러 스 레 드 가 getInstance()를 동시에 방문 하 는 방법 은 모두 줄 을 서 는 것 입 니 다.설령 이 intance 가 만 들 어 졌 더 라 도.그러나 이 인 스 턴 스 가 만 들 어 졌 다 면 동시 방문 을 지원 할 수 있 습 니 다.자물쇠 에 대한 제어 입자 화 가 필요 합 니 다.
게으름뱅이 모드-이중 검사

public class LazySingleton {
//   volatile  
  private static volatile LazySingleton singletoninstance = null;
  private Object data = new Object();

  private LazySingleton(){

  }

  public static synchronized LazySingleton getInstance(){

    if(singletoninstance == null){
      synchronized (LazySingleton.class) {
        //             
        if(singletoninstance == null)
          singletoninstance = new LazySingleton();
      }
    }
    return singletoninstance;
  }

  public Object getData() {
    return data;
  }

  public void setData(Object data) {
    this.data = data;
  }
}
두 번 째 검 사 는 방지 하기 위 한 것 이다.
스 레 드 A 에서 인 스 턴 스 가 생 성 되 지 않 은 것 을 발견 하고 자 물 쇠 를 신청 하여 임계 구역 에 들 어가 인 스 턴 스 를 만 듭 니 다.이 동시에 다른 스 레 드 도 인 스 턴 스 가 만 들 어 지지 않 은 것 을 발 견 했 습 니 다.그래서 인 스 턴 스 를 만 들 기 위해 자 물 쇠 를 신청 해 야 합 니 다.문 제 는 이렇게 발생 했 습 니 다.그리고 이 인 스 턴 스 변 수 는 volatile 로 밝 혀 져 야 합 니 다.즉,하나의 스 레 드 가 이 를 수정 하면 됩 니 다.(즉,예화)이 수정 은 바로 다른 스 레 드 를 볼 수 있 고 불필요 한 기다 림 을 피 할 수 있 습 니 다.
검사 코드 가 같 습 니 다.실행 결 과 는 같 습 니 다.
굶 주 린 남자 모델

public class HungerSingleton {

  private static final HungerSingleton singletoninstance = new HungerSingleton();
  private Object data = new Object();

  private HungerSingleton(){

  }

  public static HungerSingleton getInstance(){

    return singletoninstance;
  }

  public Object getData() {
    return data;
  }

  public void setData(Object data) {
    this.data = data;
  }

}
이 종 류 를 불 러 올 때 즉시 실례 화 인 스 턴 스 를 실행 합 니 다.스 레 드 안전 문제(jvm 에서 스 레 드 안전 문 제 를 보장 합 니 다)는 존재 하지 않 지만 자원 낭비,로드 속도 가 느 린 문제 가 존재 합 니 다.
검사 코드 가 같 습 니 다.실행 결 과 는 같 습 니 다.
홀더 모드
정적 내부 클래스 를 이용 하여 인 스 턴 스 의 실례 화 를 실현 하 는 것 이다.정적 내부 클래스 의 특성 을 이용 합 니 다.이 내부 클래스 의 인 스 턴 스 는 외부 클래스 의 인 스 턴 스 와 연결 되 지 않 고 호출 되 어야 불 러 올 수 있 으 며 로드 지연 을 실현 합 니 다.

public class HolderSingleton {

  private Object data = new Object();

  private HolderSingleton(){

  }
  
  private static class InnerClass{

    private static HolderSingleton singletoninstance = new HolderSingleton();
  }

  public static HolderSingleton getInstance(){

    return InnerClass.singletoninstance;
  }

  public Object getData() {
    return data;
  }

  public void setData(Object data) {
    this.data = data;
  }
}
테스트 코드 가 같 습 니 다.실행 결 과 는 같 습 니 다.
InnerClass 를 불 러 올 때 만 이 인 스 턴 스 를 예화 하여 로드 지연 을 실현 하고 굶 주 린 사람 모드 와 마찬가지 로 jvm 에서 스 레 드 안전 을 보장 합 니 다.이런 방법 은 추천 할 만하 다.
응용 필드:
전체 시스템 에서 하나의 인 스 턴 스 를 공유 하 는 클래스 만 단일 모드 로 실현 할 수 있 습 니 다.예 를 들 어:
사이트 의 계수 기 는 하나의 계수기 인 스 턴 스 만 존재 할 수 있 습 니 다.
스 레 드 탱크 는 하나의 스 레 드 탱크 대상 만 존재 할 수 있 습 니 다.
연결 탱크 는 하나의 연결 탱크 대상 만 존재 할 수 있 습 니 다.
지식 포인트 확장:
1.왜 단일 모드 를 사용 합 니까?
우리 의 일상적인 업무 에서 많은 대상 들 이 매우 중요 한 시스템 자원 을 점용 한다.예 를 들 어 IO 처리,데이터 베이스 작업 등 이다.그러면 우 리 는 이런 대상 들 이 하나의 공용 인 스 턴 스,즉 단일 사례 만 사용 하 는 것 을 제한 해 야 한다.
2.단일 모델 의 실현 방식
구조 함수 의 사유 화 는 다른 종류의 유일한 공용 실례 밖의 실례 를 생 성 하 는 것 을 방지한다.또한 단일 클래스 는 final 로 정의 되 어야 합 니 다.즉,단일 클래스 는 계승 할 수 없습니다.그 하위 클래스 를 계승 할 수 있다 면 인 스 턴 스 를 만 들 수 있 고 유일한 인 스 턴 스 의 취지 에 어 긋 나 기 때 문 입 니 다.
클래스 의 정적 변 수 는 단일 인 스 턴 스 의 인용 을 저장 합 니 다.
하나의 인 스 턴 스 의 인용 을 얻 기 위해 공 통 된 정적 방법
3.단일 모드 UML 도표

4.단일 모델 의 전형 적 인 실현 방식
4.567917.굶 주 린 사람 식:처음부터 인 스 턴 스 를 만 들 고 호출 할 때마다 바로 돌아 갑 니 다.전형 적 인'공간 으로 시간 을 바 꿉 니 다'4.567917.게으름뱅이 식:로 딩 지연,첫 번 째 호출 할 때 만 로 딩 한 다음 에 돌아 갑 니 다.이후 의 매번 호출 은 바로 돌아 갑 니 다.전형 적 인'시간 으로 공간 을 바꾼다'는 것 은 다 중 스 레 드 환경 에서 스 레 드 안전 문 제 를 해결 하 는 데 주의해 야 한다4.567917.등록 식:하나의 사례 모델 을 유지 하 는 것 은 주로 수량 적 인 확장 입 니 다.스 레 드 안전 한 map 를 통 해 하나의 사례 를 저장 합 니 다.이렇게 호출 할 때 이 사례 가 이미 만 들 어 졌 는 지 판단 하고 그렇지 않 으 면 바로 돌아 갑 니 다.그렇지 않 으 면 map 에 등록 한 다음 에 돌아 갑 니 다이번 우리 소 편 이 여러 편 을 결합 해 정리 한 내용 이 니 도움 이 되 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기