所谓单例模式:
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
懒汉式:指全局的单例实例在第一次被使用时构建。
#include <iostream>
#include <pthread.h>
#define barrier() __asm__ __volatile__("" ::: "memory")
using namespace std;
class Singleton
{
private:
static Singleton* pInstance;
Singleton()
{
pthread_mutex_init(&mutex, NULL);
}
Singleton(const Singleton&);
Singleton& operator = (const Singleton&);
public:
static Singleton* getInstance();
static pthread_mutex_t mutex;
void print()
{
cout << "this = " << this << endl;
}
};
pthread_mutex_t Singleton::mutex;
Singleton* Singleton::pInstance = NULL;
Singleton* Singleton::getInstance()
{
//double-check
if(pInstance == NULL)
{
pthread_mutex_lock(&mutex);
if(pInstance == NULL)
{
Singleton* temp = new Singleton;
//此处加了个内存屏障, 运行时,防止多cpu交互导致内存乱序访问
//保证对象的构造一定在barrier执行之前完成,因此pInstance被赋值时,对象总是完好的
//在x86_64架构中内核barrier的实现 #define barrier() __asm__ __volatile__("" ::: "memory")
barrier();
pInstance = temp;
}
pthread_mutex_unlock(&mutex);
}
return pInstance;
}
int main()
{
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
s1->print();
s2->print();
return 0;
}
饿汉式:指全局的单例实例在类装载时构建。
#include <iostream>
using namespace std;
class Singleton
{
private:
static Singleton* pInstance;
Singleton()
{
}
Singleton(const Singleton&);
Singleton& operator = (const Singleton&);
public:
static Singleton* getInstance();
void print()
{
cout << "this = " << this << endl;
}
};
Singleton* Singleton::pInstance = new Singleton;
Singleton* Singleton::getInstance()
{
return pInstance;
}
int main()
{
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
s1->print();
s2->print();
return 0;
}