BOOST的Singleton模版详解

文章详细探讨了为何标准的2B Singleton实现存在潜在问题,尤其是多线程环境下可能的多次初始化。接着,作者剖析了BOOST的Singleton实现,指出其通过内部类的静态成员和静态变量巧妙地保证了在多线程下的安全初始化。尽管如此,作者认为BOOST的实现过于技巧性强,限制了初始化的灵活性,且有一定的性能开销。文章最后表达了对过度依赖Singleton设计模式的疑虑。
摘要由CSDN通过智能技术生成

首先要说明,这个准确说并不是BOOST的singleton实现,而是BOOST的POOL库的singleton实现。BOOST库中其实有若干个singleton模版,这个只是其中一个。但网上大部分介绍的介绍的BOOST的Singleton实现都是这个,所以大家也就默认了。而且这个的确算是比较特殊和有趣的一个实现。

网上比较有名的文章是这篇《2B程序员,普通程序员和文艺程序员的Singleton实现》 介绍,我虽然对Singleton模版无爱,但自己的项目组中也有人用这个实现,所以还是研究了一下这个实现,特别网上真正解释清楚这个东东的人并不多(包括原文),所以还是研究了一下。

1          为啥2B实现有问题

为了介绍清楚这个实现,我们还要先解释清楚为啥2B实现有问题,首先说明,2B实现和BOOST的实现都可以解决多线程调用Singleton导致多次初始化的问题。


//H文件
 template <typename T> class Singleton_2B
 {
 protected:
     typedef  T  object_type;
     //利用的是类的静态全局变量
     static T instance_;
 public:
     static T* instance()
     {
         return &instance_;
     }
 };
 
 //因为是类的静态变量,必须有一个通用的声明
 template<typename T> typename Singleton_2B<T>::object_type  Singleton_2B<T>::instance_;
 
 //测试的例子代码。
 class Object_2B_1
 {
     
     //其实使用友元帮助我们可以让Object_2B的构造函数是protected的,从而真正实现单子的意图
     friend class Singleton_2B<Object_2B_1>;
     //注意下面用protected,大家无法构造实例
 protected:
     Object_2B_1();
     ~Object_2B_1(){};
 public:
     void do_something();
 protected:
     int data_2b_1_;
 };
 
 class Object_2B_2
 {
     friend class Singleton_2B<Object_2B_2>;
 protected:
     Object_2B_2();
     ~Object_2B_2(){};
 public:
     void do_something();
 protected:
     int data_2b_2_;
 };
 
 //CPP文件
 Object_2B_1::Object_2B_1():
     data_2b
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值