c++单例
懒汉模式
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
class Singleton
{
private:
// 构造函数私有化,因为创建一个对象要是用构造函数,直接屏蔽类外构造
Singleton() {}
// 整个类只有这一个指针
static Singleton* s;
// 加锁保护线程安全
static mutex m;
public:
static Singleton* getSingle() {
if (s == NULL) {
lock_guard<mutex> lg(m);
if (s == NULL) {
s = new Singleton();
}
}
return s;
}
};
mutex Singleton::m;
Singleton* Singleton::s = NULL;
int main()
{
Singleton* s = Singleton::getSingle();
cout << s << endl;
Singleton* p = Singleton::getSingle();
cout << p << endl;
}
饿汉模式
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
class Singleton
{
private:
Singleton() {}
static Singleton* s;
public:
static Singleton* getSingle() {
return s;
}
};
// 编译时直接确定这一个对象
Singleton* Singleton::s = new Singleton;
int main()
{
Singleton* s = Singleton::getSingle();
cout << s << endl;
Singleton* p = Singleton::getSingle();
cout << p << endl;
}
懒汉是在需要的时候初始化优点是延时加载,要保护线程安全必须加锁,饿汉模式是线程安全的因为他在编译期就确定了不管你需不需要,而且它本身就是线程安全的。