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 ...