Dan Li - JiyangM/spring GitHub Wiki

  • 实现1:
public class Singleton {

    private static Singleton singleton = new Singleton();

    private Singleton() {

    }

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

弊端: 对实例无法做到延迟加载,当初始化实例需要耗费资源时不适用!

  • 实现2:
public class Singleton {

    private static Singleton singleton;

    private Singleton() {

    }

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

弊端: 虽然做到延迟加载,只有调用getInstance()时才会初始化变量,但是为了线程安全,引入了同步关键字,可想而知,在并发程序设计中,也不是非常靠谱。

  • 实现3:内部类解决了延迟加载和线程安全问题。
public class Singleton {

    private Singleton() {

    }

    private static class SingletonHolder {
        private static Singleton singleton = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.singleton;
    }
}

优点:

  • 延迟加载:Singleton 被加载时,内部类不会实例化。
  • 线程安全