如何在没有 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
我知道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