1. 定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式,特点如下
- 单例类只有一个实例对象
- 该单例对象必须由单例类自行创建
- 单例类对外提供一个访问该单例的全局访问点
2. 懒汉式单例:类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例
- 线程不安全的实现
//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;
};
两个线程同时首次调用instance方法且同时检测到p是NULL值,则两个线程会同时构造一个实例给m_pInstance
- 加锁的经典懒汉实现
//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;
}
- 内部静态变量的懒汉实现
class CSingleton
{
public:
static CSingleton* GetInstance()
{
static CSingleton m_pInstance = CSingleton();
return &m_pInstance;
}
protected:
CSingleton() { }
~CSingleton() { }
};
3. 饿汉式单例:类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在(线程安全)
//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();