根据许多人的说法,除非您运行 1.5 或更高版本并使用volatile
关键字,否则有些常见的 Double-Checked Locking 惯用语在 java 中已被破坏。
一个损坏的双重检查锁示例:
// Broken multithreaded version
// "Double-Checked Locking" idiom
class Foo {
private Helper helper = null;
public Helper getHelper() {
if (helper == null)
synchronized(this) {
if (helper == null)
helper = new Helper();
}
return helper;
}
// other functions and members...
}
该示例来自这篇文章,该文章还提供了有关如何修复它的详细信息: http ://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
Pugh 的上述分析是针对 Java 虚拟机的。我在 Android 上工作,经常使用采用双重检查锁定的库。dalvik VM 的内存模型是否支持这个习语?