# 普通单例模式的实现

合格的单例模式的实现,至少要保证以下三点:

  1. 实现单例功能;
  2. 延迟加载;
  3. 并发时不出错。

# 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;
    }
}
  • 双校验懒汉模式的优点:弥补了懒汉模式的缺点,防止了并发问题。
  • 双校验懒汉模式的缺点:因为涉及到锁,因此性能有损耗;代码变得更复杂。