Java 如何在没有易失性的情况下打破双重检查锁定

Java 如何在没有易失性的情况下打破双重检查锁定,java,multithreading,locking,Java,Multithreading,Locking,我知道基于这个链接 我想在我家的电脑上模拟这种情况。我有标准的jdk1.7和多核处理器。但我无法模拟这种破碎的行为。我正在使用这个测试来模拟这个。 我也创建了一些测试,但没有成功。 你知道如何模拟这种没有volatile的双重检查习惯用法被破坏的情况吗?因此,它返回部分创建的Helper类。在x86上,它需要一个包含大量字段的类,以便初始化存储溢出发布,如下所示: 或者,您必须使用编译器来随机化指令调度程序。在非TSO架构(如ARM)上,无需任何技巧即可演示这一点,请参阅: 问题是您可能正在运

我知道基于这个链接

我想在我家的电脑上模拟这种情况。我有标准的jdk1.7和多核处理器。但我无法模拟这种破碎的行为。我正在使用这个测试来模拟这个。 我也创建了一些测试,但没有成功。
你知道如何模拟这种没有volatile的双重检查习惯用法被破坏的情况吗?因此,它返回部分创建的Helper类。

在x86上,它需要一个包含大量字段的类,以便初始化存储溢出发布,如下所示:

或者,您必须使用编译器来随机化指令调度程序。在非TSO架构(如ARM)上,无需任何技巧即可演示这一点,请参阅:

问题是您可能正在运行x86处理器。据我所知,在对象构造之后,它们会发出StoreLoad屏障,因此在这种情况下,您将不会看到部分构造的对象。如果你能得到一个sparc或其他处理不同构造的系统,你可能会看到这个问题。我想知道是否有可能更新这些示例?至少我试过在jdk-13上运行
UnsafeDCL
,它不会再失败了。。
class Foo { 
    private Helper helper = null;
    public Helper getHelper() {
        if (helper == null) {
            synchronized(this) {
                if (helper == null) {
                    helper = new Helper();
                }
            }
        }
        return helper;
    }
}