#include<iostream>#include<thread>#include<vector>usingnamespace std;//饿汉模式classhunSingleton{public://静态公有成员函数,获取单例对象static hunSingleton*getInstance(){return&hSingleton;}voidprint(){
cout <<"Print is called"<< endl;}private://构造函数为私有函数hunSingleton(){
cout <<"hunSingleton is called"<< endl;
hunSingleton::getInstance();};//私有static单例对象static hunSingleton hSingleton;};
hunSingleton hunSingleton::hSingleton;voidfun1(){auto p = hunSingleton::getInstance();
p->print();}intmain(){auto ptr1 = hunSingleton::getInstance();auto ptr2 = hunSingleton::getInstance();
cout <<(ptr1==ptr2?"true":"false")<< endl;
vector<thread> threadPool;for(int i =0; i <10; i++){
threadPool.push_back(thread(fun1));}for(auto&ptr: threadPool){
ptr.join();}return0;}//输出:
hunSingleton is called
true
Print is called
Print is called
Print is called
Print is called
Print is called
Print is called
Print is called
Print is called
Print is called
Print is called
2. 懒汉模式:
特点:不创建单例对象直到需要这个单例对象。
优点以及缺点:
不会造成资源浪费,如果不需要创建单例对象;
但是多线程编程较为复杂。
#include<vector>#include<thread>#include<iostream>#include<mutex>usingnamespace std;//懒汉模式classlazySingleton{public:voidprint(){
cout <<"print is called"<< endl;}static lazySingleton*getInstance(){if(lazyST_ ==nullptr){
std::lock_guard<std::mutex>lock(mu_);if(lazyST_ ==nullptr){
lazyST_ =newlazySingleton();}}return lazyST_;}private:static std::mutex mu_;static lazySingleton* lazyST_;lazySingleton(){
cout <<"lazySingleton is called"<< endl;};};
std::mutex lazySingleton::mu_;
lazySingleton* lazySingleton::lazyST_ =nullptr;voidfunc2(){auto* ptr = lazySingleton::getInstance();
ptr->print();}intmain(){
vector<thread> threadPool;for(int i =0; i <10; i++){
threadPool.push_back(thread(func2));}for(auto&p: threadPool){
p.join();}return0;}//输出
lazySingleton is called
print is called
print is called
print is called
print is called
print is called
print is called
print is called
print is called
print is called
print is called
#include<iostream>#include<vector>#include<thread>usingnamespace std;classsingleton{public:static singleton*getInstance(){static singleton ptrST_;return&ptrST_;}voidprint(){
cout <<"print is called"<< endl;}private:
singleton (){
cout <<"singleton is called"<< endl;}};voidfunc(){auto ptr = singleton::getInstance();
ptr->print();}intmain(){
vector<thread> threadPool;for(int i =0; i <10; i++){
threadPool.push_back(thread(func));}for(auto&p: threadPool){
p.join();}return0;}//输出
singleton is called
print is called
print is called
print is called
print is called
print is called
print is called
print is called
print is called
print is called
print is called