c++单例模式范例
懒汉模式
对象用到时创建,普通懒汉线程不安全,可能在创建静态对象时候,还没创建完,后续对象调用时仍是null的情况;
饿汉模式
对象先于main创建,线程安全
双重检测机制懒汉模式
为了解决第一种情况而生
静态局部变量
最简单的一种方式了
具体代码如下,分别实现了几种方式
test.h
#include <iostream>
#include <sstream>
#include <sqlite3.h>
#include <vector>
#include <random>
using namespace std;
class Balance{
//懒汉
#if 0
public:
static Balance* getInstance(){
if(m_instance == nullptr){
m_instance = new Balance();
}
return m_instance;
}
private:
Balance(){}
static Balance* m_instance;
#endif
//饿汉
#if 0
public:
static std::shared_ptr<Balance> getInstance(){
cout<<"m_instance: "<<m_instance<<endl;
return m_instance;
}
private:
static std::shared_ptr<Balance> m_instance;
Balance(){}
#endif
//双重检测机制懒汉
#if 0
public:
static Balance* getInstance(){
if(m_instance == nullptr){
std::unique_lock<std::mutex> lock(balance_mutex);
if(m_instance == nullptr){
m_instance = new Balance();
}
}cout<<"m_instance: "<<m_instance<<endl;
return m_instance;
}
static void delInstance(){
std::unique_lock<std::mutex> lock(balance_mutex);
if(m_instance){
delete m_instance;
m_instance = nullptr;
}
}
private:
static Balance* m_instance;
static std::mutex balance_mutex;
Balance(){}
#endif
//静态变量
public:
static Balance getInstance();
private:
Balance(){}
//静态变量
public:
std::vector<string> b_vector;
void b_list_add(const string &string){
b_vector.push_back(string);
}
string get_server(){
std::random_device ran;
auto i = ran()%(b_vector.size());
return b_vector[i];
}
};
//双重检测懒汉
//Balance* Balance::m_instance = nullptr;
//std::mutex Balance::balance_mutex;
//饿汉
//std::shared_ptr<Balance> Balance::m_instance = std::shared_ptr<Balance>(new Balance());
//普通懒汉 不安全
//Balance* Balance::m_instance = nullptr;
#include "test.h"
//静态变量
Balance Balance::getInstance(){
static Balance m_instance;
cout<<"m_instance: "<< &m_instance << endl;
return m_instance;
}
void test6(){
auto obj1 = Balance::getInstance();
auto obj2 = Balance::getInstance();
obj1.b_list_add("server1");
obj1.b_list_add("server2");
obj1.b_list_add("server3");
for(auto i=0; i<10; i++){
cout<<"第:"<<i<<" 个请求,需要服务器:" <<obj1.get_server()<<endl;
}
//双重检测
// obj1->delInstance();
}
int main()
{
test6();
return 0;
}