자바 진급-단일 모드

5336 단어 자바단일 모드
1.단일 모델 개념 및 특징
        자바 에서 단일 모델 은 흔히 볼 수 있 는 디자인 모델 로 단일 모델 은 세 가지 로 나 뉜 다.게으름뱅이 식 단일 사례,굶 주 린 식 단일 사례,등록 식 단일 사례 세 가지 로 나 뉜 다.
단일 모드 는 특징 이 있 습 니 다.
        1.단일 클래스 는 하나의 인 스 턴 스 만 있 을 수 있 습 니 다.
2.단일 사례 류 는 자신 이 자신의 유일한 인 스 턴 스 를 만들어 야 합 니 다.
        3.단일 클래스 는 모든 다른 대상 에 게 이 인 스 턴 스 를 제공 해 야 합 니 다.
이 특징 은 바로 우리 가 단일 모델 을 구축 하 는 방법 이다.
1)구조 함수 민영화;
2)자신의 대상 만 들 기;
3)외부 에 방법 을 제공한다.
단일 모드 는 하나의 인 스 턴 스 만 있 고 자체 적 으로 예화 되 어 전체 시스템 에 이 인 스 턴 스 를 제공 하도록 확보 합 니 다.컴퓨터 시스템 에 서 는 스 레 드 탱크,캐 시,로그 대상,대화 상자,프린터,그래 픽 카드 의 드라이버 대상 이 하나의 예 로 설계 되 어 있 습 니 다.이러한 응용 은 모두 많 든 적 든 자원 관리자 의 기능 을 가지 고 있다.컴퓨터 마다 프린터 가 몇 개 있 을 수 있 지만 프린터 스 풀 러 는 두 개의 인쇄 작업 이 동시에 프린터 에 출력 되 는 것 을 피 할 수 있 습 니 다.모든 컴퓨터 에는 몇 개의 통신 포트 가 있 을 수 있 으 며,시스템 은 하나의 통신 포트 가 두 개의 요청 에 동시에 호출 되 지 않도록 집중 적 으로 관리 해 야 한다.한 마디 로 단일 모델 을 선택 한 것 은 불일치 상 태 를 피하 고 정 치 를 많이 하지 않도록 하기 위 한 것 이다.
바로 이 특징 때문에 단일 대상 은 보통 프로그램 에 설 정 된 정 보 를 저장 하 는 매개체 로 서 다른 대상 이 일치 하 는 정 보 를 읽 을 수 있 기 때문이다.예 를 들 어 특정한 서버 프로그램 에서 이 서버 의 설정 정 보 는 데이터베이스 나 파일 에 저 장 될 수 있 습 니 다.이 설정 데 이 터 는 특정한 단일 대상 에서 통일 적 으로 읽 을 수 있 습 니 다.서비스 프로 세 스 의 다른 대상 이 이러한 설정 정 보 를 얻 으 려 면 이 단일 대상 에 접근 하면 됩 니 다.이런 방식 은 복잡 한 환경 에서 특히 다 중 스 레 드 환경 에서 의 배치 관 리 를 크게 간소화 하 였 으 나 응용 장면 에 따라 동기 화 문 제 를 가 져 올 수 있다.
2.단일 사례 모델 의 예
1.굶 주 린 사람 방식 의 일례 모델
public class Singleton1 {
/*       */
private Singleton1(){
}
/*         */
private static final Singleton1 instance = new Singleton1();
/*      */
public static Singleton1 getInstance(){
		return instance;
}
}

특징:라인 은 안전 하지만 효율 은 비교적 낮다 처음부터 클래스 new 대상 을 불 러 옵 니 다.
2.게으름뱅이 방식 의 일례 모델
//      .             
 public class Singleton2 {
     //        
     private Singleton2() {}
     //  ,    final    
     private static Singleton2 single=null;
     //       
     public synchronized  static Singleton2 getInstance() {
          if (single == null) {  
              single = new Singleton2();
          }  
         return single;
     }
 }

특징:Singleton 은 구조 방법 을 private 로 한정 하여 외부 에서 예화 되 는 것 을 피 할 수 있 습 니 다.같은 가상 컴퓨터 범위 내 에서 Singleton 의 유일한 인 스 턴 스 는 getInstance()방법 으로 만 접근 할 수 있 습 니 다.           사실 자바 반사 체 제 를 통 해 구조 방법 을 private 로 예화 할 수 있 습 니 다.그러면 기본적으로 모든 자바 단일 사례 를 무효 화 할 수 있 습 니 다.이 문 제 는 여기 서 토론 하지 않 고,우선 귀 를 가리 고 아 웅 하 며 반사 메커니즘 이 존재 하지 않 는 다 고 생각한다.
     그러나 상기 게으름뱅이 식 사례 의 실현 은 스 레 드 안전 문 제 를 고려 하지 않 았 습 니 다.스 레 드 가 안전 하지 않 습 니 다.병발 환경 에서 여러 개의 Singleton 사례 가 발생 할 수 있 습 니 다.스 레 드 안전 을 실현 하려 면 다음 과 같은 세 가지 방식 이 있 습 니 다.모두 getInstance 라 는 방법 을 개조 하여 게으름뱅이 식 사례 의 스 레 드 안전 을 확보 합 니 다.만약 에 첫 번 째 접촉 사례 모델 이 있다 면.스 레 드 안전 에 대해 잘 모 르 기 때문에 먼저 아래 세 가 지 를 뛰 어 넘 고 배 고 픈 한식 사례 를 보 러 갈 수 있 습 니 다.보고 나 서 스 레 드 안전 문 제 를 돌 이 켜 볼 수 있 습 니 다.
3.등록 식 일례 류
//      .
 //  Spring     ,     ,         。
 public class Singleton3 {
     private static Map<String,Singleton3> map = new HashMap<String,Singleton3>();
     static{
         Singleton3 single = new Singleton3();
         map.put(single.getClass().getName(), single);
     }
     //        
     protected Singleton3(){}
     //      ,         
     public static Singleton3 getInstance(String name) {
         if(name == null) {
             name = Singleton3.class.getName();
             System.out.println("name == null"+"--->name="+name);
         }
         if(map.get(name) == null) {
             try {
                 map.put(name, (Singleton3) Class.forName(name).newInstance());
             } catch (InstantiationException e) {
                 e.printStackTrace();
             } catch (IllegalAccessException e) {
                 e.printStackTrace();
             } catch (ClassNotFoundException e) {
                 e.printStackTrace();
             }
         }
         return map.get(name);
     }
     //          
     public String about() {    
         return "Hello, I am RegSingleton.";    
     }    
     public static void main(String[] args) {
         Singleton3 single3 = Singleton3.getInstance(null);
         System.out.println(single3.about());
     }
 }

굶 주 린 사람 식 과 게 으 른 사람 식 의 차이
이름 으로 는 굶 주 린 사람과 게으름뱅이,
굶 주 린 사람 은 클래스 가 불 러 오 면 하나의 예 를 초기 화하 여 getInstance 를 보장 할 때 하나의 예 는 이미 존재 합 니 다.
게 으 른 사람 은 게 을 러 서 getInstance 를 호출 할 때 만 이 예 를 초기 화 합 니 다.
그리고 다음 두 가지 방법 으로 다음 과 같은 두 가 지 를 구분한다.
1.라인 안전:
굶 주 린 사람 은 천성적으로 스 레 드 가 안전 하기 때문에 다 중 스 레 드 에 직접 사용 할 수 있 고 문제 가 발생 하지 않 습 니 다.
게으름뱅이 식 자 체 는 비 스 레 드 안전 이다.스 레 드 안전 을 실현 하기 위해 몇 가지 방법 이 있 는데 그것 이 바로 위의 1,2,3 이다.이 세 가지 실현 은 자원 로드 와 성능 에 있어 약간의 차이 가 있다.
2.자원 로드 와 성능:
       굶 주 린 사람 식 은 클래스 를 만 드 는 동시에 정적 대상 을 예화 합 니 다.나중에 이 예 를 사용 하 든 안 하 든 일정한 메모 리 를 차지 하지만 이에 따라 첫 번 째 호출 시 속도 도 빠 릅 니 다.자원 이 초기 화 되 었 기 때 문 입 니 다.
      한편,게으름뱅이 식 은 말 그대로 로드 가 지연 되 고 이 사례 를 처음 사용 할 때 만 대상 이 나 오고 첫 번 째 호출 시 초기 화 를 해 야 하 며 해 야 할 일이 많 으 면 성능 이 지연 되 고 그 다음 에는 굶 주 린 사람 식 과 같다.
무엇이 라인 안전 입 니까?
        코드 가 있 는 프로 세 스 에 여러 개의 스 레 드 가 동시에 실행 되 고 있 으 면 이 스 레 드 는 이 코드 를 동시에 실행 할 수 있 습 니 다.매번 실행 결과 가 단일 스 레 드 가 실 행 된 결과 와 같 고 다른 변수의 값 도 예상 한 것 과 같 으 면 스 레 드 가 안전 합 니 다.
       또는 하나의 클래스 나 프로그램 이 제공 하 는 인 터 페 이 스 는 스 레 드 에 있어 원자 조작 이거 나 여러 스 레 드 간 의 전환 으로 인해 이 인터페이스의 실행 결과 에 이의 성 이 존재 하지 않 습 니 다.즉,우 리 는 동기 화 문 제 를 고려 하지 않 아 도 됩 니 다.그것 이 바로 스 레 드 안전 입 니 다.

좋은 웹페이지 즐겨찾기