线程安全的singleton

来源:互联网 发布:python标准库 编辑:程序博客网 时间:2024/04/26 03:51

 

"1) sington 在进入main函数前初始化.

2)第一次使用时, singlton已得到正确的初始化(包括在static code中情况). Written by gavinkwoe"

"由于create_object将在被调用(static object_type & instance())之前进行初始化,因此singleton_default对象的初始化被放到了main之前。非常巧妙的一个设计" 

 可以参考 游戏人生博客 Writen by Fox(yulefox.at.gmail.com) 设计模式(三)——Singleton

http://www.cppblog.com/Fox/archive/2009/09/22/96898.html  http://www.yulefox.com/20081119/design-patterns-03.html/

  

这个设计用到了模板可复用,如Singleton<MySingletonClass>::instance().

 

上边的第20行是为了让create_object能够实例化, 从而引发它的构造函数调用单体实例, 从而使在main开始前就已经调用过一次.

如果不是用模板实现, 第20行完全可以去掉. object_creator也不需要定义空的do_nothing函数.

由于使用模板, 并且模板有延迟实例化的机制, 所以要在之间插入do_nothing以强行实例化静态成员.

 

 

这个设计可以达到如下需求:

1. 有访问单体的时候才会去实例化.

2. 实例化时保证在main函数之前.

3. 如果没有访问单体, 则不会生成实例.

 

另外一个题外话, 之所以把单体放在静态函数中, 除了封装的问题, 还有就是可以保证拿到的实例都是初始化过的.

如果直接把单体用静态成员来实现, 那自然是可以保证main之前初始化, 但不利于封装, 从而在实现可能变更时涉及的改动模块较多.

 

用一个静态成员来当引子, 在其构造函数中调用单体实例, 从而保证单体实例第一次调用肯定在main之前, 的确是个巧妙的设计.

原创粉丝点击