單例模式,保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它們的全局訪問(wèn)點(diǎn)。
而在多線程的環(huán)境下,如果多個(gè)線程調(diào)用getInstance,可能會(huì)創(chuàng)建出多個(gè)對(duì)象,因此需要用互斥量來(lái)保護(hù)臨界區(qū)。這里使用了C++11的mutex互斥量,同時(shí)使用lock_guard對(duì)象,使用RAII的思想保護(hù)臨界區(qū)。
class Singleton
{
public:
static Singleton* getInstance()
{
//先判斷實(shí)例是否存在,不存在再加鎖處理
if(instance==nullptr)
{
lock_guard<mutex> lock(m_mutex);
//兩個(gè)線程同時(shí)調(diào)用getInstance方法同時(shí)進(jìn)入,還是會(huì)創(chuàng)建兩個(gè)實(shí)例
if (instance == nullptr)
{
instance = new Singleton;
}
}
return instance;
}
private:
//私有函數(shù)讓其不能被構(gòu)造,也不能拷貝
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;
}