[디자인 모델] 단일 디자인 모델 의 N 중 자바 실현 방법

전재 출처 를 밝 혀 주 십시오: http://blog.csdn.net/ns_code/article/details/17359719
 
특징.
    단일 모드 의 특징:
    1. 하나의 인 스 턴 스 만 있 을 수 있 습 니 다.
    2. 자신의 인 스 턴 스 를 만들어 야 합 니 다.
    3. 모든 다른 대상 에 게 이 인 스 턴 스 를 제공 해 야 합 니 다.
 
굶 주 린 한식 일례 모델
    사전 로드 법 이 라 고도 부 르 는데 실현 방식 은 다음 과 같다.
class Single 

{

	private Single()(

		Syustem.out.println("ok");

	)

	private static Single instance = new Single();



	public static Single getInstance(){

		return instance;

	}

}

   장점: 스 레 드 가 안전 하고 호출 할 때 반응 속도 가 빠 르 며 클래스 로 딩 과 동시에 정적 대상 을 만 들 었 습 니 다.
   단점: 자원 이용 효율 이 높 지 않 아 이 인 스 턴 스 가 필요 하지 않 을 수도 있 지만 시스템 에 불 러 왔 습 니 다.
 
게으름뱅이
    지연 로드 법 이 라 고도 부 르 는데 실현 방식 은 다음 과 같다.
public class LazySingleton {

    private static LazySingleton instance;    

    private LazySingleton() {}

    

    public static LazySingleton getInstance() {             

		if (instance == null) {                       

			instance = new LazySingleton();           

		}

        return instance;                                      

    }

}

 
    지연 로드 법 은 단일 스 레 드 환경 에 적 용 됩 니 다. 스 레 드 가 안전 하지 않 습 니 다. 다 중 스 레 드 를 도입 할 때 getInstance () 방법 을 동기 화하 여 보호해 야 합 니 다. 그렇지 않 으 면 Lazy Singleton 의 두 개의 다른 인 스 턴 스 로 돌아 갈 수 있 습 니 다.예 를 들 어 하나의 스 레 드 는 인 스 턴 스 를 null 로 판단 한 후에 새로운 인 스 턴 스 를 만 들 지 못 했 습 니 다. 다른 스 레 드 는 이때 인 스 턴 스 를 null 로 판단 합 니 다. 그러면 두 스 레 드 는 두 개의 Lazy Singleton 인 스 턴 스 를 만 들 것 입 니 다.
    getInstance () 방법 을 동기 화 방법 으로 바 꿀 수 있 습 니 다. 그러면 상기 문 제 를 피 할 수 있 습 니 다. 개 선 된 단일 모델 은 다음 과 같 습 니 다.
public class LazySingleton {

    private static LazySingleton instance;    

    private LazySingleton() {}

    

    public static synchronized LazySingleton getInstance() {             

		if (instance == null) {                       

			instance = new LazySingleton();           

		}

        return instance;                                      

    }

}

    장점: 자원 이 용 률 이 높 아 getInstance 를 실행 하지 않 으 면 인 스 턴 스 가 되 지 않 습 니 다.
    단점: 첫 번 째 로 딩 시 반응 이 빠 르 지 않 고 다 중 스 레 드 사용 불필요 한 동기 화 비용 이 많이 듭 니 다.
 
 여기 서 단점 은 getInstance () 방법 을 호출 할 때마다 동기 화 되 어야 하 며, 동기 화 는 필요 하지 않 을 때 가 많 습 니 다. 이 는 성능 을 크게 떨 어 뜨 릴 수 있 습 니 다 (특히 getInstance 방법 을 여러 번 호출 해 야 하 는 곳 에서).
 
DCL 단일 모드
    지연 로드 법의 동기 화 실현 에 따 른 성능 이 낮은 문제 에 대해 서 는 getInstance () 방법 을 호출 할 때마다 동기 화 되 지 않도록 DCL, 즉 이중 검사 잠 금 (Double Check Lock) 방법 을 사용 할 수 있 습 니 다.실현 방식 은 다음 과 같다.
public class LazySingleton {

    private static LazySingleton instance;    

    private LazySingleton() {}

    

    public static LazySingleton getInstance() {             

		if (instance == null) {  

			synchronized(LazySingleton.class){

				if(instance == null){

					instance = new LazySingleton();  

				}

			}

		}

        return instance;                                      

    }

}

    장점: 자원 이 용 률 이 높 고 getInstance 를 실행 하지 않 으 면 인 스 턴 스 가 되 지 않 으 며 다 중 스 레 드 에서 효율 이 높 습 니 다.
    단점: 처음 불 러 올 때 반응 이 좋 지 않 습 니 다. 자바 메모리 모델 의 일부 원인 으로 인해 가끔 실패 할 수 있 습 니 다. 높 은 병발 환경 에서 도 어느 정도 결함 이 있 습 니 다. 발생 확률 은 낮 지만.
 
static 내부 클래스 단일 예 모드
    이 방법 은 DCL 방법 이 병발 환경 에서 의 결함 을 해결 하기 위해 제 기 된 것 이다. DCL 이 병발 프로 그래 밍 에 존재 하 는 문제점 에 대해 서 는 이 글 을 참고 할 수 있다. http://blog.csdn.net/ns_code/article/details/17348313 의 후반 부, 그 실현 방식 은 다음 과 같다.
class Single 

{

	private Single()(

		Syustem.out.println("ok");

	)

	

	private static class InstanceHolder{

		private static final Singlet instance = new Single();

	}



	public static Single getInstance(){

		return InstanceHolder.instance;

	}

}


    장점: 스 레 드 가 안전 하고 자원 이 용 률 이 높 으 며 getInstance 를 실행 하지 않 으 면 인 스 턴 스 가 되 지 않 습 니 다.
    단점: 처음 불 러 올 때 반응 이 좋 지 않 습 니 다.
 
    여기 서 마지막 방법 에 대해 다음 과 같은 기본 지식 을 보충 합 니 다. 클래스 내부 클래스 (static 수식 이 있 는 구성원 내부 클래스) 는 외부 클래스 의 구성원 에 해당 하 며, 처음 사용 할 때 만 불 러 옵 니 다. 클래스 로 더 가 외부 클래스 를 불 러 올 때 불 러 오지 않 습 니 다.그래서 자원 이 용 률 이 높다.
 
    요약: 자바 에서 병행 프로 그래 밍 과 관련 되 기 때문에 효율, 안전성 등 문 제 를 고려 하여 보통 굶 주 린 한식 단일 모델 이나 static 내부 유형의 단일 모델 을 자주 사용 하 는데 이들 의 장단 점 이 마침 뒤 바 뀌 었 기 때문에 구체 적 인 상황 에 따라 사용 해 야 한다.
 
 
참고 자료: http://blog.csdn.net/ns_code/article/details/17348313
                  http://write.blog.csdn.net/postlist/0/all/draft
                  http://www.myexception.cn/software-architecture-design/1235112.html
                  http://m.blog.csdn.net/blog/codezjx/8883599
                     http://blog.sina.com.cn/s/blog_6d2890600101gb8x.html  
 
 
 
 

좋은 웹페이지 즐겨찾기