【问题标题】:How to break double checked locking without volatile如何在没有 volatile 的情况下打破双重检查锁定
【发布时间】:2015-03-10 10:34:27
【问题描述】:

我知道double check locking without volatile variable is not safe基于此链接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 的双重检查习语被破坏时,你知道如何模拟这种情况吗?所以它返回部分创建的 Helper 类。

【问题讨论】:

  • 问题是您可能正在针对 x86 处理器运行。据我所知,他们在对象构造后会发出 StoreLoad 屏障,因此在这种情况下,您将看不到部分构造的对象。如果你能得到一个 sparc 或其他处理不同构造的系统,你可能会发现问题。

标签: java multithreading locking


【解决方案1】:

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

或者,您必须使用编译器来随机化指令调度程序。在 ARM 等非 TSO 架构上,无需任何技巧即可证明这一点,请参阅: http://shipilev.net/blog/2014/safe-public-construction/#_correctness

【讨论】:

  • 我想知道是否可以更新示例?至少我已经尝试在 jdk-13 上运行 UnsafeDCL 并且它不会再失败了..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多