C 單例模式及執行緒安全

2021-10-23 06:18:54 字數 3865 閱讀 3583

2.餓漢模式

3.懶漢模式(常用)

設計模式:

設計模式(design pattern)**是一套被反覆使用、多數人知曉的、經過分類的、**設計經驗的總結。**為什麼會產生設計模式這樣的東西呢?就像人類歷史發展會產生兵法。最開始部落之間打仗時都是人拼人的對

砍。後來春秋戰國時期,七國之間經常打仗,就發現打仗也是有套路的,後來孫子就總結出了《孫子兵法》。孫子兵法也是類似。

使用設計模式的目的:為了**可重用性、讓**更容易被他人理解、保證**可靠性。 設計模式使**編

寫真正工程化;設計模式是軟體工程的基石脈絡,如同大廈的結構一樣。

單例模式:

乙個類只能建立乙個物件,即單例模式,該模式可以保證系統中該類只有乙個例項,並提供乙個訪問它的全域性訪問點,該例項被所有程式模組共享。比如在某個伺服器程式中,該伺服器的配置資訊存放在乙個檔案

中,這些配置資料由乙個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲取這些配置資訊,這種方式簡化了在複雜環境下的配置管理。

單例模式有兩種實現模式:

理解:

就是說不管你將來用不用,程式啟動時就建立乙個唯一的例項物件。
單例(唯一的例項物件)

實現:

1.與實現唯一抽象類原理相同,通過私有化建構函式和析構函式實現單例(唯一物件)

2.通過static關鍵字,實現訪問其私有成員並建立物件

//單例:

//餓漢 --> 一上來就初始化,main函式開始之間就例項化物件

class singleton

private:

//建構函式私有化

singleton()

//拷貝建構函式私有化

singleton

(const singleton&

)= delete;

static singleton _sinst;

//宣告};

通過位址檢視是否使用餓漢模式實現單例

驗證:

int

main()

}));

}for

(auto

& e : vthreads)

system

("pause");

return0;

}

理解:

使用時才載入資源,第一次使用例項物件時,建立物件。程序啟動無負載。多個單例例項啟動順序自由控制。
概念:如果單例物件構造十分耗時或者占用很多資源,比如載入外掛程式啊, 初始化網路連線啊,讀取檔案啊等

等,而有可能該物件程式執行時不會用到,那麼也要在程式一開始就進行初始化(餓漢模式),就會導致程式啟動時非常的緩慢。 所以這種情況使用懶漢模式(延遲載入)更好。

實現:1.同理,私有化建構函式和拷貝建構函式,實現單例

2.static關鍵字修飾函式變數,訪問私有成員

與餓漢模式不同,在於懶漢模式在類中封裝的是物件指標,所以static初始化的是指標型別。

class singleton

return

*_sinst;

}private:

//建構函式私有化

singleton()

//拷貝建構函式私有化

singleton

(const singleton&

)= delete;

static singleton* _sinst;

//宣告};

singleton* singleton:

:_sinst = nullptr;

intmain()

呼叫getinstance()介面申請空間例項化指標所指向空間,後面程序再進來時無需再次申請空間,提高效能

**測試:

餓漢模式在多執行緒下不是執行緒安全的,如上圖但這是乙個隨機性bug,並不出每次都會出現問題原因:

假設有多執行緒場景下,第乙個執行緒進入時指標為空申請空間,但這個執行緒如果還沒來得及退出,第二個執行緒進來判斷時,指標仍為空,再次申請空間,導致無法實現單例模式下的執行緒安全。

解決方法:

加鎖,若指標為空,第乙個執行緒進入後,加鎖操作,其他執行緒均被阻塞,無法進入,當第乙個執行緒資源空間申請後解決,其他執行緒再進入,就可以解決。

class singleton

_stx.

unlock()

;return

*_sinst;

}private:

//建構函式私有化

singleton()

//拷貝建構函式私有化

singleton

(const singleton&

)= delete;

static singleton* _sinst;

//宣告

static mutex _stx;};

singleton* singleton:

:_sinst = nullptr;

mutex singleton:

:_stx;

可多次執行,看是否解決

此時已經解決懶漢模式的執行緒安全問題。

優化:

class singleton

_stx.

unlock()

;}return

*_sinst;

}private:

//建構函式私有化

singleton()

//拷貝建構函式私有化

singleton

(const singleton&

)= delete;

static singleton* _sinst;

//宣告

static mutex _stx;};

singleton* singleton:

:_sinst = nullptr;

mutex singleton:

:_stx;

intmain()

}));

}for

(auto

& e : vthreads)

system

("pause");

return0;

}

懶漢模式更為常用優點:是在第一次呼叫初始化建立例項,不影響程式的啟動。其次他呼叫時建立初始化,順序可以控制

缺點:實現相對複雜

單例模式及執行緒安全

單例模式即整個程序中只存在乙個例項物件,所有執行緒共用同乙個例項物件 所謂餓漢,即非常飢餓,一開始就需要食物,也就是說物件例項在編譯過程中類載入時就建立例項。public class single public static single getinstance 所謂懶漢,就是非常懶。你不讓它幹活就...

設計模式 C 單例及執行緒安全

1 單例類保證全域性只有乙個唯一的例項物件。2 單例類保證只有唯一的介面獲取這唯一例項。class singleton singleton const singleton delete singleton operator const singleton delete singleton publi...

c 多執行緒單例模式 執行緒安全C 單例模式

我對此處記錄的單例模式有一些疑問 http us library ff650316.aspx 以下 摘自該文章 using system public sealed class singleton private static volatile singleton instance private ...