단례 모드의 몇 가지 쓰기 및 주의사항

13421 단어 디자인 모델
1. 아사자식(정적 변수)
// ( )
class single1{
	// ,  new
	private single1(){}
	// 
	private final static single1 a=new single1();
	// , 
	public static single1 getA() {
		return a;
	}
	
}

장점과 단점 설명: 1) 장점: 이런 문법은 비교적 간단하고 클래스가 적재될 때 실례화를 완성한다.스레드 동기화 문제 2) 단점: 클래스를 마운트할 때 실례화를 완료하여 Lazy Loading 효과가 없습니다.만약에 처음부터 끝까지 이 실례를 사용한 적이 없다면 메모리의 낭비를 초래할 수 있다3) 이런 방식은classloder 메커니즘을 바탕으로 여러 라인의 동기화 문제를 피할 수 있다. 그러나 a는 클래스를 불러올 때 실례화된다. 단일 모델에서 대부분은 geta 방법을 사용하지만 클래스를 불러오는 원인은 여러 가지가 있기 때문에 다른 방식(또는 다른 정적 방법)이 클래스를 불러오는 것을 확정할 수 없다.이때 a를 초기화하면 lary loading의 효과에 도달하지 못한다. 4) 결론: 이런 단일 모델은 사용할 수 있고 메모리 낭비를 초래할 수 있다. 2.굶주림(정적 코드 블록)
// ( )
class single2{
	// ,  new
	private single2(){
		
	}
	
	private  static single2 a;
	// , 
	static {// 
		a=new single2();}
	public static single2 getA() {
		return a;
	}
	
}

장단점 설명:
  • 이런 방식은 위의 방식과 유사하다. 클래스를 실례화하는 과정을 정적 코드 블록에 두었을 뿐이고 클래스가 불러올 때 정적 코드 블록의 코드를 집행하고 클래스를 초기화하는 실례이기도 하다.장단점은 위와 같다.2) 결론: 이런 단일 모델은 사용할 수 있지만 메모리 낭비를 초래할 수 있다
  • 3. 게으름뱅이식(라인이 안전하지 않음)
    class single3{
    	// ,  new
    	private single3(){
    		
    	}
    	
    	private  static single3 a;
    	// , , 
    	public static single3 getA() {
    		if(a==null)
    			a=new single3();
    		return a;
    	}
    }
    

    장단점 설명: 1) Lazry Loading 효과가 있지만 단일 라인에서만 사용할 수 있습니다.2) 만약에 다중 스레드 아래에서 한 스레드가if(a==null) 판단 문장 블록에 들어가면 미래에 집행해야 하고 다른 스레드도 이 판단 문장을 통과하면 여러 가지 실례가 발생한다.그래서 다선정 환경에서 이런 방식을 사용할 수 없다. 3) 결론: 실제 개발에서 이런 방식을 사용하지 마라. 4.게으름뱅이식(라인 안전, 동기화 안전)은 방법3.게으름뱅이식(스레드가 안전하지 않다) 중의 geta() 방법에 키워드synchronized 키워드의 장단점 설명: 1) 스레드가 안전하지 않은 문제를 해결했다2) 효율이 너무 낮다. 매 스레드마다 실례적인 인치를 생각하고 선택한 geta 방법은 모두 동일하게 진행해야 한다.이 방법은 실례화 코드를 한 번만 실행하면 되고, 후에 생각한 실례는 리턴을 진짜로 연결하면 된다.방법 분출 동조 효율이 너무 낮다3) 결론은 실제에서 이 방식을 사용하는 것을 추천하지 않는다.게으름뱅이식(스레드 안전, 동기화 코드 블록)
    class single3{
    	// ,  new
    	private single3(){
    		
    	}
    	
    	private  static single3 a;
    	// , , 
    	public static single3 getA() {
    		if(a==null)
    		synchronized{	a=new single3();}
    		return a;
    	}
    }
    

    장단점 설명: 1) 이런 방식은 네 번째 실현 방식을 개선하고자 하는 것이다. 앞의 동기화 방법의 효율이 너무 낮기 때문에 동기화하여 실례화된 코드 블록 2로 바꾸었다. 그러나 이런 동기화는 라인 동기화의 역할을 하지 못한다.세 번째 실현 방식과 만나는 상황이 일치한다. 만약에 한 라인이if(a==null) 판단 문장 블록에 들어가면 앞으로 계속 집행해야 하고 다른 라인도 이 판단 문장을 통과한다면 이때 여러 가지 실례가 생길 것이다. 3) 결론: 실제 개발에서 이런 방식을 사용할 수 없다. 6.이중 검사
    class single6{
    	// ,  new
    	private single6(){
    		
    	}
    	
    	private  static volatile single6 a;//volatile a 
    	// , , 
    	public static single6 getA() {
    		if(a==null)
    			synchronized(single6.class){
    				if(a==null)
    					a=new single6();
    			}
    			
    		return a;
    	}
    }
    

    장단점 설명:
  • Double Check 개념은 다중 스레드 개발에서 자주 사용되는 것으로 코드에서 보듯이 다시if(anull) 검사를 실시했다. 이렇게 하면 스레드가 안전해졌음을 보장할 수 있다. 2) 실례화 코드는 한 번만 실행한 다음에 방문하여if(anull)를 판단하고 리얼리턴의 실례화 대상을 연결하며 반복적인 실행 방법도 피한다.3) 라인 안전: 적재 지연, 효율이 비교적 높다(4) 결론은 이 방법을 추천한다.정적 내부 클래스
  • class single7{
    	// ,  new
    	private single7(){
    		
    	}
    	// , single7
    	private static class single{
    		 private static final single7 a=new single7();
    	}
    	// , , 
    	public static synchronized single7 getA() {
    		
    		return single.a;
    	}
    }
    

    장단점 설명: 1) 이런 방식은 클래스 적재 메커니즘을 채택하여 실례를 초기화할 때 하나의 라인만 있음을 보장한다.2) 정적 내부 클래스 방식은singleton 7 클래스가 불러올 때 즉시 실례화되지 않고 실례화가 필요할 때 geta 방법을 사용해서single 클래스를 불러와single7의 실례화를 완성한다.3) 클래스의 정적 속성은 클래스를 처음 로드할 때만 초기화됩니다. 따라서 여기서 JVM은 루트의 안전성을 확보하고 클래스를 초기화할 때 다른 루트는 들어갈 수 없습니다.4) 장점: 라인이 안전하지 않은 것을 피하고 정적 내부 유형의 특징을 이용하여 적재 지연을 실현하고 효율이 높다5) 결론: 사용을 추천한다.8. 매거
    enum single8{
    	// ,  new
    	a;
    }
    
    
    public static void main(String[] args) {
    		// TODO Auto-generated method stub
    System.out.println(single8.a==single8.a);
    	}
    

    장단점 설명: 1) JDK1의 도움을 받는다.5에 추가된 매거진으로 단일 모드를 실현합니다.다중 루틴 동기화 문제를 피할 수 있을 뿐만 아니라, 새로운 대상을 반서열화하는 것도 방지할 수 있다.2) 이런 방식은 Effective Javaf 저자 Josh Bloch가 제창한 방식 3) 결론: 추천 사용
    단일 모드 고려 사항 및 세부 사항 설명
    1) 단일 예제 모드는 시스템 메모리에 해당 클래스가 단 하나의 개체만 존재하고 시스템 자원을 절약할 수 있음을 보장하며, 자주 삭제가 필요한 일부 개체에 대해 단일 예제 모드를 사용하면 시스템 성능을 향상시킬 수 있다2) 하나의 예제 클래스를 실례화하려면 new 3) 단일 예제 모드가 아닌 적절한 대상 획득 방법을 사용해야 한다.대상을 만드는 데 시간이 너무 많이 걸리거나 자원이 너무 많이 소모된다(즉, 중량급 대상). 그러나 자주 사용하는 대상, 도구류 대상, 데이터베이스나 파일에 빈번하게 접근하는 대상(예를 들어 데이터 원본,session 공장 등)

    좋은 웹페이지 즐겨찾기