在Android中双重检查锁定

emm*_*mby 18 java android virtual-machine dalvik double-checked-locking

根据许多人的说法,除非你运行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...
  }
Run Code Online (Sandbox Code Playgroud)

该示例来自本文,其中还提供了有关如何修复它的详细信息:http: //www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

Pugh上面的分析是针对Java VM的.我在Android上工作并经常使用采用Double-Checked Locking的库.dalvik VM的内存模型是否支持这个习惯用法?

sbr*_*ges 9

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

  • 对.通过添加"volatile"关键字,这将适用于单处理器(所有Android版本)和SMP(3.0"蜂窝"及更高版本). (2认同)
  • 您需要使用某种同步操作(“易失性”、“同步”等),如 Pugh 网站上所示。问题中的损坏示例是损坏的,不应该使用。随着时间的推移,Dalvik 中反射的实现发生了相当大的变化,因此您必须查看给定版本的代码才能准确了解它的作用。我相信有一些缓存,但据我所知,字节码生成并不是所使用的技术之一。 (2认同)