實現
#pragma once
#include <windows.h>
/*
使用臨界區來枷鎖和解鎖
*/
class LockBase
{
private:
// Singleton是LockBase友元,在Singleton類內部可以訪問LockBase的私有成員
friend class Singleton;
CRITICAL_SECTION cs;
void lock()
{
EnterCriticalSection(&cs);
}
void unlock()
{
LeaveCriticalSection(&cs);
}
public:
LockBase()
{
InitializeCriticalSection(&cs);
}
~LockBase()
{
DeleteCriticalSection(&cs);
}
};
class Singleton
{
private:
static Singleton* instance;
Singleton(){}
public:
static Singleton* getInstance()
{
// 使用雙重檢驗枷鎖機制
if (NULL == instance)
{
LockBase* lockBase = new LockBase();
lockBase->lock();
if (NULL == instance)
{
instance = new Singleton();
}
lockBase->unlock();
}
return instance;
}
};
// 注意C++中靜態變量在類內是聲明,在類外是定義
Singleton* Singleton::instance = NULL;
測試
#include "Singleton.h"
#include <iostream>
using namespace std;
int main()
{
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
if (s1 == s2)
{
cout << "s1 和 s2 指向是同一個對象" << endl;
}
return 0;
}
注意
注意代碼的細節,注意C++中靜態變量的定義是在類外。