转自:https://www.cnblogs.com/dongyu666/p/6971783.html
《Effective Java》一书的第一版中推荐了一个中写法:
// Effective Java 第一版推荐写法 public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }这种写法非常巧妙:
对于内部类SingletonHolder,它是一个饿汉式的单例实现,在SingletonHolder初始化的时候会由ClassLoader来保证同步,使INSTANCE是一个真·单例。
同时,由于SingletonHolder是一个内部类,只在外部类的Singleton的getInstance()中被使用,所以它被加载的时机也就是在getInstance()方法第一次被调用的时候。
——它利用了ClassLoader来保证了同步,同时又能让开发者控制类加载的时机。从内部看是一个饿汉式的单例,但是从外部看来,又的确是懒汉式的实现。
Effective Java 2 —— 枚举
《Effective Java》的作者在这本书的第二版又推荐了另外一种方法,来直接看代码:
// Effective Java 第二版推荐写法 public enum SingleInstance { INSTANCE; public void fun1() { // do something } } // 使用 SingleInstance.INSTANCE.fun1();