【发布时间】: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