1. 定義:指一個類只有一個實例,且該類能自行創(chuàng)建這個實例的一種模式,特點如下
- 單例類只有一個實例對象
- 該單例對象必須由單例類自行創(chuàng)建
- 單例類對外提供一個訪問該單例的全局訪問點
2. 懶漢式單例:類加載時沒有生成單例,只有當(dāng)?shù)谝淮握{(diào)用 getlnstance 方法時才去創(chuàng)建這個單例
- 線程不安全的實現(xiàn)
//CSingleton.h
class CSingleton
{
public:
static CSingleton* GetInstance()
{
if ( m_pInstance == NULL )
m_pInstance = new CSingleton();
return m_pInstance;
}
protected:
CSingleton() { }
~CSingleton() { }
private:
static CSingleton* m_pInstance;
};
兩個線程同時首次調(diào)用instance方法且同時檢測到p是NULL值,則兩個線程會同時構(gòu)造一個實例給m_pInstance
- 加鎖的經(jīng)典懶漢實現(xiàn)
//CSingleton.h
class CSingleton
{
public:
static pthread_mutex_t mutex;
static CSingleton* GetInstance();
protected:
CSingleton()
{
pthread_mutex_init(&mutex);
}
private:
static CSingleton* m_pInstance;
};
//CSingleton.cpp
pthread_mutex_t CSingleton::mutex;
CSingleton* CSingleton::m_pInstance = NULL;
CSingleton* CSingleton::GetInstance()
{
if (m_pInstance == NULL)
{
pthread_mutex_lock(&mutex);
if (m_pInstance == NULL)
m_pInstance = new CSingleton();
pthread_mutex_unlock(&mutex);
}
return m_pInstance;
}
- 內(nèi)部靜態(tài)變量的懶漢實現(xiàn)
class CSingleton
{
public:
static CSingleton* GetInstance()
{
static CSingleton m_pInstance = CSingleton();
return &m_pInstance;
}
protected:
CSingleton() { }
~CSingleton() { }
};
3. 餓漢式單例:類一旦加載就創(chuàng)建一個單例,保證在調(diào)用 getInstance 方法之前單例已經(jīng)存在(線程安全)
//CSingleton.h
class CSingleton
{
public:
static CSingleton* GetInstance() { return m_CSingletonInstance; }
protected:
CSingleton() { }
~CSingleton() { }
private:
static CSingleton* m_CSingletonInstance;
};
//CSingleton.cpp
CSingleton* CSingleton::m_CSingletonInstance = new CSingleton();