对于下述单例模式,我们使用了两次判断,但是,编译器很有可能会认为第一次判断成功以后没有必要再去做第二次判断,因为编译器会认为instance的值在这两次判断之间并没有改变,编译器是不会去考虑另一个线程有没有来改变instance的值,它只看到这一段代码,但是这里的两次判断是有其作用的。

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