根据许多人的说法,java中比较常见的双重检查锁定习惯用法已经被打破,除非您运行的是1.5或更高版本并使用volatile
关键字。
一个损坏的双重检查锁样本:
// 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 VM的。我在Android上工作,经常使用采用双重检查锁定的库。dalvik VM的内存模型支持这个习惯用法吗?
发布于 2011-04-19 22:27:29
这个question的答案意味着内存模型应该是相同的,并且新的双重检查锁定习惯用法将会起作用。
发布于 2014-02-19 23:10:12
我找到了一篇关于这个问题的很好的文章:http://www.javamex.com/tutorials/double_checked_locking_fixing.shtml
它清楚地说明了3种修复DCL的方法。在您的问题中,Helper字段应该声明为volatile,否则它将无法工作。
当涉及到用法时,比如你的例子中的RoboGucie,我想我会更喜欢文章中提到的类加载器方法。这对我来说更清楚,也更有效率。
https://stackoverflow.com/questions/5717090
复制相似问题