线程安全的单例模式
程序员文章站
2022-07-14 09:17:35
...
线程安全的单例模式
懒汉模式
第一次调用GetInstance时会实例化对象,此后返回的都是该对象
template<class T>
class SingleTon
{
public:
static T* GetInstance(){}
private:
SingleTon(){}
SingleTon(const SingleTon &){}
SingleTon &operator = (const SingleTon &){}
static T * m_instance;
static pthread_mutex_t mutex;
};
template<class T>
T* SingleTon<T>::GetInstance()
{
if(m_instance == NULL)
{
pthread_mutex_lock(&mutex);
if(m_instance == NULL)
{
m_instance = new T();
}
pthread_mutex_unlock(&mutex);
}
return m_instance
}
饿汉模式:
无论是否需要,程序开始就产生该类的实例对象
template<class T>
class SingleTon
{
public:
static T* GetInstance(){}
private:
SingleTon(){}
SingleTon(const SingleTon &){}
SingleTon &operator = (const SingleTon &){}
static T * m_instance;
static pthread_mutex_t mutex;
};
template<class T>
T* SingleTon<T>::GetInstance()
{
static SingleTon instance;
return instance;
}
Q1:锁前和锁后总共检测两次?
有可能延迟加载或缓存原因,造成多个实例。
Q2:私有化构造函数?
单例类不能被实例化,单例实例只能静态调用。
Q3:选择两种模式?
(1)由于线程同步,所以访问量比较大,采用饿汉模式,可以实现更好的性能,以空间换时间
(2)如果访问量较小,用饿汉模式,以时间换空间
上一篇: Java:单例模式的七种写法(转载)
下一篇: 线程安全的单例模式