单例实现方式
java 

有时候需要采用延迟初始化来降低初始化类和创建对象的开销。双重检查锁定是常见的延时初始化技术。

基于volatile的单例,双锁检测

该方式中,必须使用volatile关键字来声明instance变量。因为对象的初始化代码可能会被重排序,也就是说instance在未初始化完成前,可能已经被其他线程访问。 volatile标识符可以禁止这种重排序。

public class Singleton {
    private volatile static Singleton instance;
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

基于类的单例

在初次调用Instance.getInstance()时初始化Instance变量,利用语言的线程安全保证静态初始化,不需要额外的同步。

public class Instance {
    private static class InstanceHolder {
        public static Instance instance = new Instance();
    }

    public static Instance getInstance() {
        return InstanceHolder.instance;
    }
}

基于枚举类型的懒加载单例

枚举类型使用私有的构造器,能够提供适当的序列化机制。他们也能以线程安全的方式懒初始化。 JVM保证了枚举值不会被多次实例化,这使得单例模式有非常大的防御反射的攻击。 这种方式是实现单例模式的推荐模式。

public enum EnumSingleton{
    INSTANCE;

    private EnumSingleton singleton;
    //JVM会保证此方法绝对只调用一次
    Singleton(){
        singleton = new EnumSingleton();
        System.out.println(122);
    }
    public EnumSingleton getInstance(){
        return singleton;
    }
}
local_offer #java 
navigate_before navigate_next