首页 > 解决方案 > Java双重检查锁单例必须使用volatile关键字?

问题描述

嗨,我在单例模式中的双重检查锁定有问题。在以下代码中:

private volatile   static DoubleCheckSingleton instance;

private DoubleCheckSingleton() {}


public static DoubleCheckSingleton getInstance(){

    if(instance==null){ //first

        synchronized (DoubleCheckSingleton.class){

            if(instance==null){  // second
                instance=new DoubleCheckSingleton();
            }

        }

    }

    return instance;

}

假设现在有两个线程,分别是 A 和 B。之后它们同时执行。根据happens-before的定义,一个线程释放锁后,另一个线程获取锁,那么后者可以看到之前的变化。

如果是这样,我认为不需要 volatile 关键字,那我们为什么要在这里使用 volatile 关键字呢?哪位朋友能解释一下?谢谢您的回答

标签: javavolatilehappens-before

解决方案


推荐阅读