[英]Double checked locking in Android
根据许多人的说法,除非你运行1.5或更高版本并使用volatile
关键字,否则对于java来说,有些常见的Double-Checked Locking成语已被破坏。
一个破损的双重检查锁定样本:
// 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上工作并经常使用采用Double-Checked Locking的库。 dalvik VM的内存模型是否支持这个习惯用法?
这个问题的答案意味着内存模型应该是相同的,并且新的双重检查锁定习惯将起作用。
我发现了一篇关于这个问题的非常好的文章: http : //www.javamex.com/tutorials/double_checked_locking_fixing.shtml
它清楚地说明了3种修复DCL的方法。 看起来在你的问题中,Helper字段应该被声明为volatile,否则它不起作用。
在使用方面,即你的RoboGucie,我想我会赞成文章中提到的类加载器方法。 这对我来说更清楚,也更有效率。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.