단일 모드 코드

10281 단어
1, 굶주림식(정적 변수---스레드 안전)
//       
public class Singleton {

    private final static Singleton instance = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return s;
    }
}

2, 굶주림식(정적 코드 블록-----스레드 보안)
public class Singleton {

    private static Singleton instance;

    static {
        instance = new Singleton();
    }

    private Singleton() {}

    public Singleton getInstance() {
        return instance;
    }
}

장점: 간단하고 거칠며 클래스를 불러올 때 직접 이 클래스를 실례화하여 라인의 동기화를 피한다.
단점: 자원 효율이 높지 않습니다. getInstance () 는 영원히 실행되지 않을 수도 있지만, 이 클래스를 실행하는 다른 정적 방법이나 클래스 (class. forName) 를 불러오면 이 실례는 임의로 초기화됩니다.
3, 게으름뱅이식(라인이 안전하지 않다---잠금 메커니즘을 추가하지 않는다)
4
public class Singleton {

    private static Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if(singleton== null){
            singleton = new Singleton();
        }
        return singleton;
    }
}
4, 게으름뱅이식(메소드 동기화 ---동기화 잠금 추가)
public class Singleton {

    private static Singleton singleton;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

5, 게으름뱅이식(스레드 보안 ---동기화 코드 블록)
public class Singleton {

    private static Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                singleton = new Singleton();
            }
        }
        return singleton;
    }
}

6, 이중 검사
public class Singleton {

    private static volatile Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

7, 정적 내부 클래스
public class Singleton {

    private Singleton() {}

    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}

8, 열거
public enum Singleton {
    INSTANCE;
    public void whateverMethod() {

    }
}

힌트: 일반적으로 굶주린 방식을 사용하는데 자원에 대해 매우 신경을 쓰면 정적 내부류를 사용할 수 있고 게으름뱅이와 이중 검사를 권장하지 않는다.

좋은 웹페이지 즐겨찾기