题目:设计一个类,我们只能生成该类的一个实例
不好的解法一:只适用于单线程环境
class Singleton1
{
public:
static Singleton1 * Intance()
{
if( NULL == instance )
instance = new Singleton1();
return instance;
}
private:
Singleton1(){}
~Singleton1(){}
static Singleton1 * instance;
};
Singleton1 * Singleton1::instance = NULL;
不好的解法二:可用于多线程但效率不高
class Singleton2
{
public:
static Singleton2 * Instance()
{
pthread_mutex_lock( &mutex );
if( NULL == instance )
instance = new Singleton2();
pthread_mutex_unlock( &mutex );
return instance;
}
private:
Singleton2(){ pthread_mutex_init( &mutex, NULL ); }
~Singleton2(){}
static pthread_mutex_t mutex;
static Singleton2 * instance;
}
Singleton2 * Singleton2::instance = NULL;
pthread_mutex_t Singleton2::mutex;
可行的解法:加同步锁前后两次判断实例是否已存在
class Singleton3
{
public:
static Singleton3 * Instance()
{
if( NULL == instance )
{
pthread_mutex_lock( &mutex );
if( NULL == instance )
instance = new Singleton3();
pthread_mutex_unlock( &mutex );
}
return instance;
}
private:
Singleton3(){ pthread_mutex_init( &mutex, NULL ); }
~Singleton3(){}
static pthread_mutex_t mutex;
static Singleton3 * instance;
};
pthread_mutex_t Singleton3::mutex;
Singleton3 * Singleton3::instance = NULL;
推荐的解法一:利用静态成员初始化
class Singleton4
{
public:
static Singleton4 * Instance() { return instance; }
private:
Singleton4(){}
~Singleton4(){}
static Singleton4 * instance;
};
Singleton4 * Singleton4::instance = new Singleton4();
推荐的解法二:按需创建实例