单例模式
恶汉式
#include <bits/stdc++.h>
using namespace std;
class Singleton{
private:
Singleton() = default;
Singleton(const Singleton& other) = default;
public:
static Singleton* getInstance();
static Singleton* m_instance;
int a = 0;
};
Singleton* Singleton::m_instance = new Singleton();
Singleton* Singleton::getInstance() {
return m_instance;
}
int main()
{
Singleton *s1 = Singleton::getInstance();
Singleton *s2 = Singleton::getInstance();
s1->a++;
s2->a++;
return 0;
}
懒汉式
#include <bits/stdc++.h>
using namespace std;
class Singleton{
private:
Singleton() = default;
Singleton(const Singleton& other) = default;
public:
static Singleton* getInstance();
static Singleton* m_instance;
int a = 0;
};
Singleton* Singleton::m_instance=nullptr;
Singleton* Singleton::getInstance() {
if (m_instance == nullptr) {
m_instance = new Singleton();
}
return m_instance;
}
int main()
{
Singleton *s1 = Singleton::getInstance();
Singleton *s2 = Singleton::getInstance();
s1->a++;
s2->a++;
return 0;
}
锁
#include <bits/stdc++.h>
using namespace std;
class Singleton{
private:
Singleton() = default;
Singleton(const Singleton& other) = default;
public:
static Singleton* getInstance();
static Singleton* m_instance;
static mutex m_mutex;
int a = 0;
};
Singleton* Singleton::m_instance=nullptr;
mutex Singleton::m_mutex;
Singleton* Singleton::getInstance() {
unique_lock<mutex> lock(m_mutex);
if (m_instance == nullptr) {
m_instance = new Singleton();
}
return m_instance;
}
int main()
{
Singleton *s1 = Singleton::getInstance();
Singleton *s2 = Singleton::getInstance();
s1->a++;
s2->a++;
return 0;
}
双检测
using namespace std;
class Singleton{
private:
Singleton() = default;
Singleton(const Singleton& other) = default;
public:
static Singleton* getInstance();
static Singleton* m_instance;
static mutex m_mutex;
int a = 0;
};
Singleton* Singleton::m_instance=nullptr;
mutex Singleton::m_mutex;
Singleton* Singleton::getInstance() {
if (m_instance == nullptr) {
unique_lock<mutex> lock(m_mutex);
if (m_instance == nullptr) {
m_instance = new Singleton();
}
}
return m_instance;
}
int main()
{
Singleton *s1 = Singleton::getInstance();
Singleton *s2 = Singleton::getInstance();
s1->a++;
s2->a++;
return 0;
}
静态变量
#include <bits/stdc++.h>
using namespace std;
class Singleton{
private:
Singleton() = default;
Singleton(const Singleton& other) = default;
public:
static Singleton* getInstance();
static Singleton* m_instance;
int a = 0;
};
Singleton* Singleton::m_instance = new Singleton();
Singleton* Singleton::getInstance() {
return m_instance;
}
int main()
{
Singleton *s1 = Singleton::getInstance();
Singleton *s2 = Singleton::getInstance();
s1->a++;
s2->a++;
return 0;
}