#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