Java 디자인 모드 - 게으름뱅이 단일 모드

2214 단어 Java 디자인 모드
게으름뱅이
게으름뱅이 단일 모드 외부 클래스에 호출될 때 실례를 만듭니다. 클래스가 불러오는 속도가 빠르지만 실행할 때 대상을 가져오는 속도가 느립니다.
2. 실례
1> 방법상synchronized 자물쇠를 사용하여 동기화를 진행하는데 이 동기화 방법의 영향 구역이 너무 커서 여러 대상이 이 대상을 얻으려고 할 때 여기에 줄을 서는 것이 단점이다.
public class LazySingleton{

    private static LazySingleton intance =null;

    private LazySingleton(){}

    
    public static synchronized LazySingleton getInstance(){

        if(instance == null){
            instance = new LazySingleton();
        }
        
        return instance;
    }

}

2> 방법체에서 이중 검사 자물쇠를 사용하여 메모리 공간을 절약하고 라인의 안전을 확보한다.

public class LazySingleton{

    private static LazySingleton instance = null;

    private LazySingleton(){}

    public static LazySingleton getInstance(){

        if(instance == null){
              synchronized(LazySingleton.class){
                    if(instance == null){
                        instance = new LazySingleton();
                    }            
               }
         }
        return instance;
    }
}

jvm에 난순서 실행 기능이 존재하기 때문에 DCL도 안전하지 않은 상황이 발생할 수 있다. 사실 jvm에서의 실행은 세 단계로 나뉜다.
          1.메모리를 쌓아 메모리 공간을 열다.          2.SingleTon의 매개 변수를 메모리에서 인스턴스화합니다.          3.대상을 메모리 공간으로 가리키다.
jvm에 난순서 실행 기능이 존재하기 때문에 2가 실행되지 않았을 때 3을 먼저 실행했을 수도 있습니다. 이때 라인 B로 전환되면 3을 실행했기 때문에 인스타그램은 비어 있지 않고 바로 꺼내서 사용할 수 있습니다. 그러면 이상이 발생합니다.이것이 바로 유명한 DCL의 실효 문제다.
바로 JDK1.6 및 이후, private volatile static LazySingleton instance=null로 정의하면 됩니다.DCL 실효 문제를 해결할 수 있습니다.volatile는 INSTANCE가 매번 메인 메모리에서 읽을 수 있도록 확보하는데, 이렇게 하면 약간의 효율도 희생되지만, 품위에는 손상이 없다.
3> 내부 클래스를 이용한 단일 사례

public class Singleton{

    private Singleton(){}

    public Static getInstance(){

        return SingleHolder.instance;
    }

   private class SingleHolder{
         private static Singleton  instance = new Singleton();

    }
}

이 실현에서 내부 클래스로 단례를 보호한다. Singleton 클래스가 불러올 때 내부 클래스가 초기화되지 않기 때문에 Singleton 클래스가 JVM에 불러올 때 단례 클래스를 초기화하지 않는다. getInstance 방법이 호출될 때 SingleHolder를 불러와서 instance를 초기화할 수 있다. 또한 실례의 구축은 클래스가 불러올 때 완성되기 때문에 천성적으로 다중 라인에 우호적이다.getInstance () 방법도synchronized 수식을 사용할 필요가 없기 때문에, 이러한 실현은 앞의 두 가지 쓰기 방법의 장점 (마운트 지연, 비동기화) 을 겸용할 수 있다.

좋은 웹페이지 즐겨찾기