자바 단례 모드의 실현(굶주림식, 게으름식, 이중 잠금 검사 메커니즘)

8916 단어 Java 디자인 모드

Java 단례 모드의 실현


왜 단례 모드를 사용합니까?

  • 빈번하게 사용되는 대상에 대해 대상을 만드는 데 걸리는 시간을 생략할 수 있는데 이것은 중량급 대상에게 매우 굉장한 시스템 비용이다.
  • new 조작 횟수가 감소하기 때문에 시스템 메모리의 사용 평가율도 낮아진다. 이는 GC의 압력을 줄이고 GC의 정지 시간을 단축시킬 것이다.

  • 단례 모델의 몇 가지 형식


    게으름뱅이

    public class Singleton {  
    	// , , null
        private static Singleton singleton=null;  
         
        private Singleton() {  
             
        }  
        // get 
        public static Singleton getInstance(){  
            if (singleton== null) {  
                singleton = new Singleton();  
            }  
             
            return singleton;  
        }  
    }
    

    아사자식

    public class Singleton {  
    	// new 
        private static Singleton singleton= new Singleton();  
         
        private Singleton() {  
             
        }  
         
        public static Singleton getInstance(){  
            return singleton;  
        }  
    }
    

    위의 두 가지 형식은 이름에서 구체적인 의미를 볼 수 있다.
  • 게으름뱅이식으로 게으르기 때문에 처음에는 아무것도 하지 않고 하지 않으면 안 될 때 임시로 new 하나
  • 굶주린 사람식, 배고파서 처음부터 new에 준비해 놓고 쓸 때 기다리지 않고 바로 먹기
  • 그러나 상술한 두 가지 방법은 단일 라인에서만 적용되고 일단 다중 라인 장면에 도착하면 라인의 안전을 보장할 수 없기 때문에 라인에 자물쇠를 채워야 한다. 자물쇠를 채워도 두 가지로 나눌 수 있다.
  • 하나는 전체 getInstance 함수에 자물쇠를 채우는 것이다
  • 하나는 동기화 블록에만 자물쇠를 채우는 것이다
  • 두 가지 자물쇠는 게으름뱅이식에 비해 낮지만 일반적으로 전체 함수에 자물쇠를 넣는 성능이 낮기 때문에 동기화 블록에 자물쇠를 넣는 것이 구체적으로 이루어진다.
    public class Singleton {  
        private static Singleton singleton;  
         
        private Singleton() {  
             
        }  
         
        public static Singleton getInstance(){  
            if (singleton== null) {  
            // 
                synchronized (Singleton.class) {  
                    if (singleton == null) {  
                        singleton= new Singleton();  
                    }  
                }  
            }  
            return singleton;  
        }  
    }
    

    그러나 이러한 실현은 여전히 문제가 있다. JVM이 컴파일할 때의 지령 재배열 문제로 인해singleton 대상이 다중 스레드 장면에서 일치하지 않기 때문에volatile 키워드로 수식해야 한다.

    이중 잠금 검측 메커니즘

    public class Singleton {  
        private volatile static Singleton singleton;  
         
        private Singleton() {  
             
        }  
         
        public static Singleton getInstance(){  
            if (singleton== null) {  
            // 
                synchronized (Singleton.class) {  
                    if (singleton == null) {  
                        singleton= new Singleton();  
                    }  
                }  
            }  
            return singleton;  
        }  
    }
    
  • volatile수식singleton은 가시성을 유지하고 명령의 순서를 재정리하는 것을 방지하기 위한 것이다
  • private수식구조함수는 그 실례화를 방지하기 위한 것이다
  • 이중 잠금 검측 메커니즘을 사용하여 단일 모델의 라인 안전을 확보했다
  • 최종적으로 클래스 내에서 정적 방법으로 방문 대상의 유일한 인터페이스를 노출
  • 좋은 웹페이지 즐겨찾기