http://www.cppblog.com/dyj057/archive/2005/09/20/346.html

大家都知道,在用C++来实现Singleton模式的时候通常把构造函数声明为私有的或者保护的。同时声明一个公有的静态的伪构造函数,通过它来调用真正的构造函数。在实现这个伪构造函数的时候通常有两种方式:  
  class   Singleton;  
   
  static   Singleton&   Singleton:;fakeSingleton()  
  {  
          static   Singleton   s;  
          return   s;  
  }  
  第二种方式:  
  class   Singleton{  
  public:  
  static   Singleton*   fakeSingleton();  
  ...  
  private:  
  Singleton();  
  static   Singleton   *   _instance;  
  }  
  Singleton*   Singleton::fakesinketon()  
  {  
        if(   _instance==NULL)  
                  _instance=new   Singleton();  
          return   _instance;  
  }  
  对于这两种方式我觉得第一种更好一些,理由是,如果有两个以上的线程同时访问伪构造函数的时候有可能同时进入if   控制块,这样就有可能产生两个实例!!因此必须采用特殊的保护机制来控制同步。而第一种方式不存在这样的问题。  
   
  请高手指点!我不明白的是,为什么书上的例子还较多的采用第二种方法?莫非它有自己的优势??  
   
Posted on 2009-01-06 16:06 micheal's tech 阅读(1563) 评论(7)  编辑 收藏 引用 所属分类: 设计模式

Feedback

# re: C++完美实现Singleton模式  回复  更多评论   

2009-01-06 20:15 by RISE
第二种更像单件一点.

# re: C++完美实现Singleton模式  回复  更多评论   

2009-01-07 01:18 by 陈梓瀚(vczh)
其实你可以加锁的,如果你愿意的话。

Windows的Mutex是不跨进程的,你大可以用一个名字去建立一个mutex然后不释放,然后函数里面open之,阻塞之。

# re: C++完美实现Singleton模式  回复  更多评论   

2009-11-10 16:05 by OwnWaterloo
如果不加保护,两种写法都有可能产生2个实例。

书上采用第2种形式居多的原因,可能是因为Gof的书……
第1种形式是Scott Meyers后来发明的。

# re: C++完美实现Singleton模式  回复  更多评论   

2009-11-11 09:56 by 溪流
“线程安全”其实也没有那么必要处处提到的,有点过于炒作的感觉。真要计较起来,大部分代码都不是线程安全的。

# re: C++完美实现Singleton模式  回复  更多评论   

2009-11-11 10:25 by OwnWaterloo
@溪流
嗯嗯,你说中了,炒作~_~
类似的还有很多……

# re: C++完美实现Singleton模式  回复  更多评论   

2010-11-17 16:06 by 白日梦飞行
第一种方式在C++中不容易实现,因为成员变量的初始化顺序不能保证,可能会出现问题。第一种方式比较适合Java

# re: C++完美实现Singleton模式  回复  更多评论   

2011-10-08 10:12 by ahu
学习了

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理