在Android中双击lockinglocking

据许多人说,除非你运行1.5或更高版本,并且使用volatile关键字,否则有些常见的双重检查locking习惯用于java

破碎的双重检查的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虚拟机的。 我在Android上工作,经常使用使用双重检查locking的库。 dalvik VM的内存模型是否支持这个习惯用法?

Solutions Collecting From Web of "在Android中双击lockinglocking"

这个问题的答案意味着内存模型应该是相同的,并且新的双重检查locking语言将起作用。

我发现了一个关于这个问题的非常好的文章: http : //www.javamex.com/tutorials/double_checked_locking_fixing.shtml

它清楚地说明了3种修复DCL的方法。 而且在你的问题中,Helper字段应该被声明为volatile,否则不起作用。

说到使用,也就是RoboGucie,我想我会赞成文章中提到的类加载器方法。 这对我来说更为清楚,而且效率更高。