首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android中的双重检查锁定

Android中的双重检查锁定
EN

Stack Overflow用户
提问于 2011-04-19 21:26:46
回答 2查看 2.3K关注 0票数 19

根据许多人的说法,java中比较常见的双重检查锁定习惯用法已经被打破,除非您运行的是1.5或更高版本并使用volatile关键字。

一个损坏的双重检查锁样本:

代码语言:javascript
复制
// 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的内存模型支持这个习惯用法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-19 22:27:29

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

票数 9
EN

Stack Overflow用户

发布于 2014-02-19 23:10:12

我找到了一篇关于这个问题的很好的文章:http://www.javamex.com/tutorials/double_checked_locking_fixing.shtml

它清楚地说明了3种修复DCL的方法。在您的问题中,Helper字段应该声明为volatile,否则它将无法工作。

当涉及到用法时,比如你的例子中的RoboGucie,我想我会更喜欢文章中提到的类加载器方法。这对我来说更清楚,也更有效率。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5717090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档