# 普通单例模式的实现
合格的单例模式的实现,至少要保证以下三点:
- 实现单例功能;
- 延迟加载;
- 并发时不出错。
# 1. 饿汉式
public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton() {
    }
    public static Singleton getInstance() {
        return instance;
    }
}
- 饿汉模式的缺点:可能在还不需要此实例的时候就已经把实例创建出来了,没起到 lazy loading 效果。
- 饿汉模式的优点:实现简单,而且安全可靠。
# 2. 懒汉式
public class Singleton {
    
    private static Singleton instance;
    private Singleton() {
    }
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
- 懒汉模式的优点:弥补了饿汉模式的缺点,起到了 lazy loading 的效果。
- 懒汉模式的缺点:多线程并发时有线程安全问题,有可能创建多个实例。
# 3. 双校验懒汉式
public class SingletonSafe {
    private static volatile SingletonSafe singleton;
    private SingletonSafe() {
    }
    public static SingletonSafe getSingleton() {
        if (singleton == null) {
            synchronized (SingletonSafe.class) {
                if (singleton == null) {
                    singleton = new SingletonSafe();
                }
            }
        }
        return singleton;
    }
}
- 双校验懒汉模式的优点:弥补了懒汉模式的缺点,防止了并发问题。
- 双校验懒汉模式的缺点:因为涉及到锁,因此性能有损耗;代码变得更复杂。