DCL懒汉式中synchronized有序性问题

public class Singleton {

    private static Singleton instance = null;

    private Singleton () {
    }

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

根据as-if-serial语义,不管怎么排序,都不能影响单线程程序的执行结果。
那上述代码中代码块中程序的执行结果是new了一个Singleton对象吗?其引用指向确定内存地址,还是不关心指令重排?

我在网上看到解释说:

synchronized保证的有序性是多个线程之间的有序性,即被加锁的内容要按照顺序被多个线程执行。

能否理解为:

synchronized(){
    instance = new Singleton ( );
    i++;
}

这段代码不会先执行i++, 在执行new Singleton ( );
对于其中的i++和new Singleton()是否会指令重排不管呢?

希望能得到解答。

阅读 2.2k
1 个回答

synchronized 并不会保证不被重排序

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题