如何在Android中双重检查锁定?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (28)

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

// 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.javamex.com/tutorials/double_checked_locking_fixing.shtml

它明确指出了3种修复DCL的方法。在你的问题中,Helper字段应该被声明为volatile,否则它不起作用。

当谈到使用情况时,例如RoboGucie,我认为我会赞成文章中提到的类加载器方法。这对我来说更加清楚,而且效率更高。

扫码关注云+社区