单例模式

2019/02/14

单例模式

单例模式的特点

  • 某个类只有一个实例
  • 它必须自行创建这个实例
  • 必须自行向系统中,提供实例

懒汉式线程不安全

public class HungrySingleton {

    private static HungrySingleton singleton;

    public HungrySingleton(){}

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

}

懒汉式线程安全

public class HungrySingleton {

    private static HungrySingleton singleton;

    public HungrySingleton(){}

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

}

饿汉式线程安全

public class LazySingleton {

    private static LazySingleton singleton = new LazySingleton();

    private LazySingleton(){}

    public static LazySingleton getInstance() {
        return singleton;
    }

}

双重锁/双重校验锁

/**
 * 双重锁校验模式,线程安全
 */
public class DCLSingleton {

    private static DCLSingleton singleton = new DCLSingleton();

    private DCLSingleton(){}

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

静态内部类

public class StaticSingleton {

    private static class RegisterSingletonHolder {
        private static final StaticSingleton INSTANCE = new StaticSingleton();
    }

    public static final StaticSingleton getInstance() {
        return RegisterSingletonHolder.INSTANCE;
    }

}

枚举

public enum  SingletonEnum {
    INSTANCE;
}

Search

    Table of Contents