我知道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类。
答案 0 :(得分:1)
在x86上,它需要一个具有大量字段的类,以便初始化存储溢出发布,如下所示: http://cs.oswego.edu/pipermail/concurrency-interest/2015-January/013861.html
或者,您必须使用munge编译器随机化指令调度程序。在像ARM这样的非TSO架构上,可以毫不费力地证明这一点,请参阅: http://shipilev.net/blog/2014/safe-public-construction/#_correctness