单线程singleton模式
#include <iostream>
using namespace std;
template <typename T>
class Singleton
{
public:
static T* getInstance()
{
if( !instance )
{
instance = new T();
}
return instance;
}
private:
Singleton();
static T* instance;
};
template <typename T>
T* Singleton<T>::instance = NULL;
class Stu
{
public:
Stu(){
cout<<"Stu"<<endl;
}
};
int main(void)
{
Stu *s = Singleton<Stu>::getInstance();
Stu *s2 = Singleton<Stu>::getInstance();
return 0;
} 单线程下安全,但是多线程则不安全:
解决办法有三种手段:
- 同步 加锁
- 急切创建 直接初始化 static T* instance = new T();
- double check
if(m_instance == NULL) { m_Lock.Lock(); if(m_instance == NULL) { instance = new T(); } m_Lock.UnLock(); }
#include <iostream>
#include <Windows.h>
using namespace std;
class CLock
{
public:
CLock()
{
::InitializeCriticalSection(&m_Section);
}
~CLock()
{
::DeleteCriticalSection(&m_Section);
}
void Lock()
{
::EnterCriticalSection(&m_Section);
}
void UnLock()
{
::LeaveCriticalSection(&m_Section);
}
private:
CRITICAL_SECTION m_Section;
};
template <typename T>
class Singleton
{
public:
static T* getInstance()
{
if( NULL == instance )
{
m_Lock.Lock();
if ( NULL == instance)
{
instance = new T();
}
m_Lock.UnLock();
}
return instance;
}
static void release()
{
if(instance)
{
delete instance;
instance = NULL;
}
}
private:
Singleton();
static CLock m_Lock;
static T* instance;
};
template <typename T>
T* Singleton<T>::instance = NULL;
template <typename T>
CLock Singleton<T>::m_Lock;
class Stu
{
public:
Stu(){
cout<<"Stu"<<endl;
}
};
int main(void)
{
Stu *s = Singleton<Stu>::getInstance();
Stu *s2 = Singleton<Stu>::getInstance();
return 0;
}

1579

被折叠的 条评论
为什么被折叠?



