安卓系统中的双重检查锁定

根据许多人的说法,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的内存模型是否支持这个成语?


答案 1

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


答案 2

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

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

当涉及到用法时,即在你的情况下的RoboGucie,我想我会更喜欢文章中提到的类加载器方法。这对我来说更清晰,效率更高。


推荐