1 恶汉式
#include <iostream>
using namespace std;
class Singleton {
private:
Singleton() {
cout << "I am singleton object" << endl;
}
public:
static Singleton* getInstance() {
return __singleton;
}
static void freeInstance() {
if (__singleton != NULL)
{
delete __singleton;
__singleton = NULL;
}
}
private:
static Singleton* __singleton;
};
Singleton* Singleton::__singleton = new Singleton;
void main() {
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
if (s1 == s2)
{
cout << "s1 is the same object as s2" << endl;
}
else
{
cout << "s1 is not the same object as s2" << endl;
}
Singleton::freeInstance();
}
2 懒汉式
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <WinBase.h>
#include <process.h>
#include <mutex>
using namespace std;
mutex sLock;
class Singleton {
private:
Singleton() {
cout << "Begin to execute construct function" << endl;
Sleep(1000);
cout << "End to execute construct function" << endl;
}
public:
static Singleton* getInstance() {
if (__singleton == NULL) {
sLock.lock();
if (__singleton == NULL)
{
__singleton = new Singleton;
}
sLock.unlock();
}
return __singleton;
}
static void freeInstance() {
if (__singleton != NULL) {
delete __singleton;
__singleton = NULL;
}
}
static void print() {
cout << "printing\n";
}
private:
static Singleton* __singleton;
};
Singleton* Singleton::__singleton = NULL;
void MyThreadFunc(void *) {
Singleton::getInstance()->print();
}
void main() {
HANDLE handle[10];
for (int i = 0; i < 2; i++)
{
handle[i] = (HANDLE)_beginthread(MyThreadFunc, 0, NULL);
}
for (int i = 0; i < 2; i++)
{
WaitForSingleObject(handle[i], INFINITE);
}
Singleton::freeInstance();
}