最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++單例模式的懶漢模式和餓漢模式詳解

 更新時間:2022年03月13日 14:29:52   作者:TABE_  
這篇文章主要為大家詳細介紹了C++懶漢模式和餓漢模式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

懶漢模式

懶漢模式在第一次用到類實例的時候才會去實例化,就是不到調(diào)用getInstance函數(shù)時,這個類的對象是一直不存在的。懶漢本身是線程不安全的。

#include <iostream>
using namespace std;
class Singelton{
private:
    Singelton(){
        m_count ++;
        printf("Singelton begin\n");
        Sleep(1000);// 加sleep為了放大效果
        printf("Singelton end\n");
    }
    static Singelton *single;//定義一個唯一指向實例的指針,并且是私有的
public:
    static Singelton *GetSingelton();//定義一個公有函數(shù),可以獲取這個唯一實例
    static void print();
    static int m_count;
};
 //將唯一指向實例的指針初始化為nullptr
Singelton *Singelton::single = nullptr;
int Singelton::m_count = 0;
Singelton *Singelton::GetSingelton(){
    if(single == nullptr){//判斷是不是第一次使用
        single = new Singelton;
    }
    return single;
}
void Singelton::print(){
    cout<<m_count<<endl;
}
int main()
{
	singleton* a1 = singleton::GetInstance();
	cout << a1 << endl;
	a1->print();
	singleton* a2 = singleton::GetInstance();
	cout << a2 << endl;
	a2->print();
	system("pause");
	return 0;
}

懶漢模式的singleton類有以下特點:

1.他有一個指向唯一實例的靜態(tài)指針,并且是私有的。

2.它有一個公有的函數(shù),可以獲取這個唯一的實例,并且在需要的時候創(chuàng)建該實例。

3.它的構造函數(shù)是私有的,這樣就不能從別處創(chuàng)建該類的實例。

餓漢模式

餓漢模式在單例類定義的時候(即在main函數(shù)之前)就進行實例化。因為main函數(shù)執(zhí)行之前,全局作用域的類成員靜態(tài)變量m_Instance已經(jīng)初始化,故沒有多線程的問題。

#include <iostream>
#include <process.h>
#include <windows.h>
using namespace std;
class Singelton{
private:
    Singelton(){
        m_count ++;
        printf("Singelton begin\n");
        Sleep(1000);                            // 加sleep為了放大效果
        printf("Singelton end\n");
    }
    static Singelton *single;//定義一個唯一指向實例的指針,并且是私有的
public:
    static Singelton *GetSingelton();//定義一個公有函數(shù),可以獲取這個唯一實例
    static void print();
    static int m_count;
};
// 餓漢模式的關鍵:定義即實例化
Singelton *Singelton::single = new Singelton;
int Singelton::m_count = 0;
Singelton *Singelton::GetSingelton(){
    // 不再需要進行實例化
    //if(single == nullptr){
    //    single = new Singelton;
    //}
    return single;
}
void Singelton::print(){
    cout<<m_count<<endl;
}
int main()
{
	cout << "we get the instance" << endl;
	singleton* a1 = singleton::getinstance();
	singleton* a2 = singleton::getinstance();
	singleton* a3 = singleton::getinstance();
	cout << "we destroy the instance" << endl;
	system("pause");
	return 0;
}

線程安全的懶漢模式

在多線程環(huán)境下,懶漢模式的上述實現(xiàn)方式是不安全的,原因在于在判斷instance是否為空時,可能存在多個線程同時進入if中,此時可能會實例化多個對象。于是出現(xiàn)了二重鎖的懶漢模式,實現(xiàn)代碼如下:

#include<iostream>
#include<mutex>
using namespace std;
/*單例模式:構造函數(shù)私有化,對外提供一個接口*/
//線程安全的單例模式
class lhsingleClass {
public:
	static lhsingleClass* getinstance()
	{//雙重鎖模式
		if (instance == nullptr)
		{//先判斷是否為空,如果為空則進入,不為空說明已經(jīng)存在實例,直接返回
            //進入后加鎖
			i_mutex.lock();
			if (instance == nullptr)
			{//再判斷一次,確保不會因為加鎖期間多個線程同時進入
				instance = new lhsingleClass();
			}
			i_mutex.unlock();//解鎖
		}
		return instance;
	}
private:
    static lhsingleClass* instance;
	static mutex i_mutex;//鎖
	lhsingleClass(){}
};
lhsingleClass* lhsingleClass::instance=nullptr;
mutex lhsingleClass::i_mutex;//類外初始化
 
int main()
{
	lhsingleClass* lhsinglep5 = lhsingleClass::getinstance();
	lhsingleClass* lhsinglep6 = lhsingleClass::getinstance();
	cout << lhsinglep5 << endl;
	cout << lhsinglep6 << endl;
	system("pause");
	return 0;
}

此代碼共進行了兩次判斷:

  • 先判斷是否為空,如果為空則進入,不為空說明已經(jīng)存在實例,直接返回。
  • 再判斷一次,確保不會因為加鎖期間多個線程同時進入。

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容! 

 

相關文章

  • C++中數(shù)組作為函數(shù)參數(shù)傳入的幾種方式代碼示例

    C++中數(shù)組作為函數(shù)參數(shù)傳入的幾種方式代碼示例

    數(shù)組元素和數(shù)組名都可以作為函數(shù)的參數(shù)以實現(xiàn)函數(shù)間數(shù)據(jù)的傳遞和共享,下面這篇文章主要給大家介紹了關于C++中數(shù)組作為函數(shù)參數(shù)傳入的幾種方式,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-06-06
  • 如何讓Dev-C++支持auto關鍵字呢

    如何讓Dev-C++支持auto關鍵字呢

    這篇文章主要介紹了如何讓Dev-C++支持auto關鍵字問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • C++利用容器查找重復列功能實現(xiàn)

    C++利用容器查找重復列功能實現(xiàn)

    本文將詳細介紹c++容器簡介,c++容器的比較 與操作實例,需要了解更多的朋友可以參考下
    2012-11-11
  • Vscode中接入Deepseek的實現(xiàn)

    Vscode中接入Deepseek的實現(xiàn)

    本文主要介紹了Vscode中接入Deepseek的實現(xiàn),包括登錄Deepseek官網(wǎng)、申請APIKEY、安裝和配置VSCode插件,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • C++報錯:Segmentation Fault的解決方案

    C++報錯:Segmentation Fault的解決方案

    段錯誤(Segmentation Fault)是 C++ 編程中常見且令人頭疼的錯誤之一,段錯誤通常發(fā)生在程序試圖訪問未被允許的內(nèi)存區(qū)域時,導致程序崩潰,本文將深入探討段錯誤的產(chǎn)生原因、檢測方法及其預防和解決方案,需要的朋友可以參考下
    2024-07-07
  • C++?stack用法總結(示例詳解)

    C++?stack用法總結(示例詳解)

    std::stack?是?C++?標準模板庫(STL)中的容器適配器,它提供了棧(stack)的功能,基于其他序列容器實現(xiàn),下面給大家介紹std::stack?的用法總結,感興趣的朋友一起看看吧
    2024-01-01
  • C++線程池實現(xiàn)代碼

    C++線程池實現(xiàn)代碼

    C++11中,線程我們可以理解為對應一個thread對象,任務可以理解為要執(zhí)行的函數(shù),通常是耗時的函數(shù)。線程過多或者頻繁創(chuàng)建和銷毀線程會帶來調(diào)度開銷,進而影響緩存局部性和整體性能
    2021-12-12
  • C++實現(xiàn)stack與queue數(shù)據(jù)結構的模擬

    C++實現(xiàn)stack與queue數(shù)據(jù)結構的模擬

    stack是一種容器適配器,專門用在具有后進先出操作的上下文環(huán)境中,其刪除只能從容器的一端進行 元素的插入與提取操作;隊列是一種容器適配器,專門用于在FIFO上下文(先進先出)中操作,其中從容器一端插入元素,另一端提取元素
    2023-04-04
  • C語言常見排序算法之交換排序(冒泡排序,快速排序)

    C語言常見排序算法之交換排序(冒泡排序,快速排序)

    這篇文章主要介紹了C語言常見排序算法之交換排序(冒泡排序,快速排序),冒泡排序即Bubble?Sort,類似于水中冒泡,較大的數(shù)沉下去,較小的數(shù)慢慢冒起來,假設從小到大,即為較大的數(shù)慢慢往后排,較小的數(shù)慢慢往前排
    2022-07-07
  • 深入理解C預處理器

    深入理解C預處理器

    下面小編就為大家?guī)硪黄钊肜斫釩預處理器。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08

最新評論

会同县| 南木林县| 淄博市| 景谷| 柳林县| 安溪县| 遵义市| 民勤县| 双峰县| 麻栗坡县| 东城区| SHOW| 五家渠市| 刚察县| 墨脱县| 东丰县| 黑山县| 乳山市| 区。| 赤水市| 怀集县| 镇安县| 金平| 延川县| 财经| 迁西县| 遵化市| 嘉义市| 焦作市| 安龙县| 莱州市| 涞源县| 泸水县| 宣恩县| 大渡口区| 余干县| 包头市| 青川县| 榆树市| 韩城市| 措美县|