单例模式,保证一个类仅有一个实例,并提供一个访问它们的全局访问点。
而在多线程的环境下,如果多个线程调用getInstance,可能会创建出多个对象,因此需要用互斥量来保护临界区。这里使用了C++11的mutex互斥量,同时使用lock_guard对象,使用RAII的思想保护临界区。
class Singleton
{
public:
static Singleton* getInstance()
{
//先判断实例是否存在,不存在再加锁处理
if(instance==nullptr)
{
lock_guard<mutex> lock(m_mutex);
//两个线程同时调用getInstance方法同时进入,还是会创建两个实例
if (instance == nullptr)
{
instance = new Singleton;
}
}
return instance;
}
private:
//私有函数让其不能被构造,也不能拷贝
Singleton() {};
Singleton(const Singleton&) {};
Singleton& operator = (const Singleton&) {};
static Singleton *instance;
static mutex m_mutex;
};
Singleton* Singleton::instance = nullptr;
mutex Singleton::m_mutex;
int main()
{
Singleton *single1 = Singleton::getInstance();
Singleton *single2 = Singleton::getInstance();
if (single1 == single2)
{
cout << "=" << endl;
}
return 0;
}