由于要进行线程同步,所以在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现
在访问量较小时,采用懒汉实现
饿汉模式:线程安全
//假如有一个全局对象A 构造函数里引用上文中饿汉形式的指针,
//若在A构造函数构造之前以上单例并未构造出来,那就会有问题。
class singleton
{
protected:
singleton()
{}
private:
static singleton* p;
public:
static singleton* initance();
};
singleton* singleton::p = new singleton;
singleton* singleton::initance()
{
return p;
}
线程安全的懒汉模式
class singleton
{
protected:
singleton()
{
pthread_mutex_init(&mutex);
}
private:
static singleton* p;
public:
static pthread_mutex_t mutex;
static singleton* initance();
};
pthread_mutex_t singleton::mutex;
singleton* singleton::p = NULL;
singleton* singleton::initance()
{
//因为每次判断是否为空都需要被锁定,如果有很多线程的话,就会造成大量线程的阻塞。
//于是出现了双重锁定。
if (p == NULL)
{
pthread_mutex_lock(&mutex);
if (p == NULL)
p = new singleton();
pthread_mutex_unlock(&mutex);
}
return p;
}
内部静态变量的懒汉模式
class singleton
{
protected:
singleton()
{
pthread_mutex_init(&mutex);
}
public:
static pthread_mutex_t mutex;
static singleton* initance();
};
pthread_mutex_t singleton::mutex;
singleton* singleton::initance()
{
pthread_mutex_lock(&mutex);
static singleton obj;
pthread_mutex_unlock(&mutex);
return &obj;
}