singleton模式的一种变体:double-checked locking

原创 2001年10月12日 20:25:00
singleton模式的一种变体:double-checked locking

在单线程下,我们的singleton多半是这样(java):
class Singleton{
  private Singleton(){ //... };
  private static Singleton instance = null;
  public static Singleton getInstance
  {
    if ( instance == null )
      instance = new Singleton();
    return instance;
  };
  //...
  }

但是在多线程环境下,这里有个问题:如果一个线程先检查了instance==null,然后开始创建新的实例;同时另一个线程又来检查instance==null(此时第一个线程的创建还没完成),然后也创建新的实例。这样就有了Singleton类的两个实例——我们的singleton模式失败了。

所以我们应该加入同步代码。但是加在哪里呢?如果每个线程都需要同步再获得实例引用,这必然会形成一个瓶颈;如果在instance==null的检查后面加同步代码……这根本没有用。为什么?自己想想吧。

我们应该怎么办?同步代码肯定应该在instance==null的后面,同时,在创建新对象之前应该再检查一次instance==null:
class Singleton{
  //...
  private synchronized static void doSync(){
    //在这里同步
  }
  public Singleton getInstance(){
    if(instance==null){
      Singleton.doSync();
      if(instance==null)  // 再进行一次检查
        instance = new Singleton();
    }
    return instance;
  }

两次检查,既避免了效率瓶颈,又避免了重复创建。这就是double-checked locking模式。

Double Checked Locking 模式

之前在使用Double Check Locking 模式时,发现自己还是不太理解。于是写个记录,其实很简单,一看就明白了。应用特别说明:1.Double Check Locking模式是singlet...
  • wwsoon
  • wwsoon
  • 2007年01月17日 16:42
  • 6531

Java设计模式之单例模式 double---checked----locking双重检查锁定

在GoF的23种设计模式中,单例模式是比较简单的一种。然而,有时候越是简单的东西越容易出现问题。下面就单例设计模式详细的探讨一下。 所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在。...
  • yansong_8686
  • yansong_8686
  • 2016年02月18日 23:53
  • 416

单例解析-Double-checked locking and the Singleton pattern

Level: IntermediatePeter Haggar (haggar@us.ibm.com), Senior Software Engineer, IBM 01 May 2002All pr...
  • tianzizhi
  • tianzizhi
  • 2009年03月15日 23:07
  • 1377

双重检查锁定失败可能性——参照《The "Double-Checked Locking is Broken" Declaration》

双重检查锁定失败可能性——参照《The "Double-Checked Locking is Broken" Declaration》  双重检查锁定在延迟初始化的单例模式中见得比较多(单例模式实...
  • gerryzhu
  • gerryzhu
  • 2013年12月24日 09:50
  • 2877

Singleton 单件模式及其变体 Double-Checked Locking 双重检查锁模式

        Singleton 单件模式, 及其变体 Double-Checked Locking 双重检查锁模式, 都可以用于确保某个类只有一个对象实例化.两个模式的区别在于: Singleto...
  • zhangcunli
  • zhangcunli
  • 2009年10月17日 09:50
  • 933

双重检查锁定的漏洞的分析 The "Double-Checked Locking is Broken" Declaration

本文根据http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html 来翻译,纯粹为了自己学习做记录,有生硬不通的地方还...
  • ykdsg
  • ykdsg
  • 2011年04月07日 21:57
  • 1791

解决fortify扫描出的Code Correctness: Double-Checked Locking问题(java语言)

现有java代码如下: 。。。 if (fitz == null) {   synchronized (this) {     if (fitz == null) {       fitz ...
  • wypdao
  • wypdao
  • 2013年03月04日 15:07
  • 2827

Double-checked locking and the Singleton pattern

http://www-106.ibm.com/developerworks/java/library/j-dcl.html?dwzone=java
  • bosses
  • bosses
  • 2004年10月15日 22:40
  • 796

(设计模式)Singleton和Double-Checked Locking模式

h1,h2,h3,h4,h5 { font-family:Verdana, Arial; color:#112233; margin:10px 0px; }p { margin:5px 0px; pa...
  • fcrpg2005
  • fcrpg2005
  • 2007年01月20日 01:02
  • 946

[转贴] Double-checked locking and the Singleton pattern

Please make a reference to http://www.ibm.com/developerworks/java/library/j-dcl.html,http://www.cs.u...
  • booboo2006
  • booboo2006
  • 2008年07月04日 18:06
  • 366
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:singleton模式的一种变体:double-checked locking
举报原因:
原因补充:

(最多只允许输入30个字)