단일 모델 의 해석 과 다양한 실현

4475 단어 디자인 모드
1. 단일 모드 는 무엇 입 니까?
2. 단일 모드 를 이해 하면 무엇 을 합 니까?장단 점장면 사용?
3. 굶 주 린 사람과 게 으 른 사람:
4. 손 찢 기 모드
1. 굶 주 린 사람.
2. 스 레 드 가 안전 하지 않 음 + 게으름뱅이
3. 단일 잠 금 라인 보안 + 게으름뱅이
4. DCL 이중 검출 (실효 버 전)
5. 정상 판 이중 검 측 실현 사례 (volatile 사용)
6. 정적 내부 클래스 를 이용 하여 라인 안전 을 실현 하 는 게으름뱅이 식 단일 모드
7. 매 거 를 이용 하여 단 례 를 실현 한다
1. 단일 모드 는 무엇 입 니까?
단일 모드 (Singleton Pattern) 는 자바 에서 가장 간단 한 디자인 모델 중 하나 이다.
  • 1. 사례 류 는 하나의 사례 만 있 을 수 있다.
  • 2. 단일 클래스 는 자신의 유일한 인 스 턴 스 를 만들어 야 합 니 다.
  • 3. 단일 클래스 는 모든 다른 대상 에 게 이 인 스 턴 스 를 제공 해 야 합 니 다
  • 2. 단일 모드 를 이해 하면 무엇 을 합 니까?장단 점장면 사용?
    사용 목적: 하나의 인 스 턴 스 만 있 고 전체 방문 점 을 제공 합 니 다.
    장점: (1) 메모리 에 하나의 인 스 턴 스 만 있 고 메모리 비용 을 줄 였 습 니 다. 특히 인 스 턴 스 를 자주 만 들 고 소각 합 니 다 (2) 자원 의 다 중 점용 을 피 합 니 다.
    단점: (1) 인터페이스 가 없 으 면 (2) 계승 할 수 없다 (3) 단일 직책 원칙 과 충돌
    사용 장면: (1) 자원 공유 의 경우 자원 조작 시 발생 하 는 성능 이나 손실 등 을 피한다.위 로그 파일 과 같이 설정 을 적용 합 니 다.
    (2) 자원 을 통제 하 는 상황 에서 자원 간 의 상호 통신 을 편리 하 게 한다.스 레 드 탱크 등
    3. 굶 주 린 사람과 게 으 른 사람:
  •  굶 주 린 사람 은 클래스 가 불 러 올 때 인 스 턴 스 를 만 들 었 고 스 레 드 가 단일 대상 에 접근 하기 전에 이미 만 들 었 습 니 다.게다가 하나의 클래스 는 전체 생명주기 에 한 번 만 불 러 오기 때문에 이 단일 클래스 는 하나의 실례 만 생 성 할 수 있다. 즉, 라인 은 매번 이 유일한 대상 만 받 을 수 있다.그래서 굶 주 린 한식 의 단 례 는 천성적으로 라인 이 안전 하 다 는 것 이다.
  • 게으름뱅이 식 은 클래스 로드 가 완 료 된 후에 인 스 턴 스 를 만 들 지 않 고 스 레 드 가 필요 할 때 만 듭 니 다.

  • 우열 의 구분: 굶 주 린 사람 식 은 classloder 체제 에 의 해 다 중 스 레 드 의 동기 화 문 제 를 피 했 지만 나중에 이 인 스 턴 스 를 사용 하지 않 으 면 메모 리 를 낭비 할 수 있 습 니 다.게으름뱅이 식 은 실제 사용 할 때 인 스 턴 스 를 만 들 지만 스 레 드 가 안전 한 것 은 아니다.
    4. 손 찢 기 모드
    단일 모델 의 실현 은 여러 가지 방식 이 있 는데 다음 과 같다.
    1. 굶 주 린 사람.
    	public class Singleton {
    		
    		private Singleton(){}
    		
    		private static Singleton instance = new Singleton();
    		
    		public static Singleton getInstance(){
    			return instance;
    		}
    	}
    

    2. 스 레 드 가 안전 하지 않 음 + 게으름뱅이
    	public class Singleton {
    		
    		private Singleton(){}
    		
    		private static Singleton instance;
    		
    		public static Singleton getInstance(){
    			if(instance == null){
    				instance = new Singleton();		
    			}
    			return instance;
    		}
    	}
    

    3. 단일 잠 금 라인 보안 + 게으름뱅이
    	public class Singleton {
    		
    		private Singleton(){}
    		
    		private static Singleton instance;
    		
    		public synchronized static Singleton getInstance(){
    			if(instance == null){
    				instance = new Singleton();		
    			}
    			return instance;
    		}
    	}
    	//      ,      getInstance()       ,    。
    

    4. DCL 이중 검출 (실효 버 전)
    	public static Singleton instance;
    	public static Singleton getInstance()
    	{
    	  if (instance == null)          
    	  {                                  
    	    synchronized(Singleton.class) {   //   1
    	      if (instance == null)                   //   2
    	        instance = new Singleton();  
    	    }
    	  }
    	  return instance;
    	}
    
  • 먼저 왜 두 번 의 판단 이 필요 한 지 말 해 보 세 요. 스 레 드 1 이 정상 적 인 것 을 가정 하고 자 물 쇠 를 가 져 와 잠 금 구역 에 들 어가 임 무 를 수행 합 니 다. 이때 스 레 드 2 가 위치 1 에 실 행 했 을 때 잠 겨 있 는 것 을 발견 하고 스 레 드 1 이 자 물 쇠 를 풀 때 까지 기다 릴 수 밖 에 없습니다.스 레 드 1 이 자 물 쇠 를 풀 면 스 레 드 2 가 잠 금 에 들 어 갑 니 다. 위치 2 의 두 번 째 검사 가 없다 고 가정 하면 스 레 드 2 도 인 스 턴 스 를 만 듭 니 다. 이것 은 단일 모드 에 어 긋 납 니 다.따라서 전역 에 하나의 인 스 턴 스 만 생 성 될 수 있 도록 위치 2 에서 판단 해 야 한다.
  • 두 번 째 는 이런 버 전의 이중 검 측 이 잘못 되 었 고 구체 적 인 오류 원인 은 다시 한 편의 설명 을 하고 지면 이 너무 길다 는 것 이다.클릭 하여 점프: DCL 실효
  •  
    5. 정상 판 이중 검 측 실현 사례 (volatile 사용)
    	public class Singleton {
    		
    		private Singleton(){}
    		
    		private static volatile Singleton instance;
    		
    		public static Singleton getInstance(){
    			if(instance == null){
    				synchronized(Singleton.class){
    					if(instance == null){
    						instance = new Singleton();		
    					}
    				}
    			}
    			return instance;
    		}
    	}
    

    6. 정적 내부 클래스 를 이용 하여 라인 안전 을 실현 하 는 게으름뱅이 식 단일 모드
    	public class Singleton {
    		
    		private Singleton(){}
    		
    		private static class SingletonHolder {
    			private static Singleton instance = new Singleton();
    		}
    		
    		public static Singleton getInstance(){
    			return SingletonHolder.instance;
    		}
    	}
    	

    이러한 쓰기 의 장점 은 정적 내부 류 의 특징 을 충분히 이용 하고 초기 화 작업 은 외부 류 와 분리 된다 는 것 이다.getInstance () 방법 을 호출 하지 않 기 전에 정적 내부 클래스 는 초기 화 되 지 않 고 이 방법 을 처음 호출 한 후에 유일한 인 스 턴 스 를 생 성 합 니 다. 
    7. 매 거 를 이용 하여 단 례 를 실현 한다
    	public enum Singleton {
    		
    		INSTANCE;
    		
    		public void fun(){}
    		
    	}
    	

    매 거 진 을 사용 하여 단일 모델 을 실현 하고 간단 하고 호출 효율 이 높 으 며 매 거 진 자체 가 단일 사례 이 며 JVM 이 근본적으로 보장 을 제공 하여 반사 와 반 직렬 화 를 통 해 구멍 을 피 하 는 것 이 단점 이 며 로드 지연 이 없다 는 것 이 단점 이다.

    좋은 웹페이지 즐겨찾기