单例模式功能:
1. 确保一个类只有一个实例被建立
2. 提供了一个对对象的全局访问指针 3. 在不影响单例类的客户端的情况下允许将来有多个实例一:懒汉式(特点:延迟加载,用的时候才创建对象)
class CSingleton {
public:
static CSingleton* GetInstance() {
if ( m_pInstance == NULL ) {
m_pInstance = new CSingleton();
}
return m_pInstance;
}
}
private:
CSingleton(){};
static CSingleton * m_pInstance;
};
注:在懒汉式的单例类中,其实有两个状态,单例未初始化和单例已经初始化。假设单例还未初始化,有两个线程同时调用GetInstance方法,这时执行 m_pInstance == NULL 肯定为真,然后两个线程都初始化一个单例,最后得到的指针并不是指向同一个地方,不满足单例类的定义了,所以懒汉式的写法会出现线程安全的问题!在多线程环境下,要对其进行修改
多线程情况下懒汉单例模式的代码:
class Singleton {
private:
static Singleton* m_instance;
Singleton(){}
public:
static Singleton* getInstance(); };
Singleton* Singleton::getInstance() {
if(NULL == m_instance) {
Lock();//借用其它类来实现,如boost
if(NULL == m_instance) {
m_instance = new Singleton;
}
UnLock();
}
return m_instance;
}
二:饿汉式
class CSingleton {
private: CSingleton() {
}
public:
static CSingleton * GetInstance()
{
return &instance;
}
private:
static CSingleton instance;
};
总结: