首先要说明,这个准确说并不是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