Java线程安全的Singleton具有双重检查的锁定

示例

这种类型的Singleton是线程安全的,并且可以在创建Singleton实例之后防止不必要的锁定。

Java SE 5
public class MySingleton {

    // 类的实例
    private static volatile MySingleton instance = null;

    // 私有构造函数
    private MySingleton() {
        // 一些构造对象的代码
    }

    public static MySingleton getInstance() {
        MySingleton result = instance;
        
        //如果实例已经存在,则无需锁定
        if(result == null) {
            //单例实例不存在,请锁定并再次检查
            synchronized(MySingleton.class) {
                result = instance;
                if(result == null) {
                    instance = result = new MySingleton();
                }
            }
        }
        return result;
    }
}

必须强调的是-在Java SE 5之前的版本中,上述实现是错误的,应避免使用。在Java 5之前的Java中无法正确实现双重检查锁定。