如何在没有 volatile 的情况下打破双重检查锁定

How to break double checked locking without volatile

我知道double check locking without volatile variable is not safe based on this link http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

class Foo { 
    private Helper helper = null;
    public Helper getHelper() {
        if (helper == null) {
            synchronized(this) {
                if (helper == null) {
                    helper = new Helper();
                }
            }
        }
        return helper;
    }
}

我想在家里的电脑上模拟这种情况。我有标准的 jdk1.7 和多核处理器。但我无法模拟损坏的行为。我正在使用这个应该模拟这个的测试http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckTest.java。 我也创建了一些我的测试,但没有成功。 你知道如何模拟这个没有 volatile 的双重检查习惯用法被破坏时的情况吗?所以它 returns 部分创建了 Helper class.

在 x86 上,它需要具有大量字段的 class,以便初始化存储溢出发布,如下所示: http://cs.oswego.edu/pipermail/concurrency-interest/2015-January/013861.html

或者,您必须修改编译器以随机化指令调度程序。在像 ARM 这样的非 TSO 架构上,这可以在没有任何技巧的情况下进行演示,请参阅: http://shipilev.net/blog/2014/safe-public-construction/#_correctness