單例模式與執行緒安全單例模式(懶漢 餓漢)

2021-08-20 17:30:08 字數 1937 閱讀 2370

直接就可以在靜態區初始化instance,然後通過getinstance返回,這種就被稱為餓漢式單例類。也有些寫法是在getinstance中new instance然後返回,這種就被稱為懶漢式單例類,但這涉及到第一次getinstance的乙個判斷問題。

單例大約有兩種實現方法:懶漢與餓漢。

懶漢:故名思義,不到萬不得已就不會去例項化類,也就是說在第一次用到類例項的時候才會去例項化;

餓漢:餓了肯定要飢不擇食。所以在單例類定義的時候就進行例項化。

特點與選擇:

由於要進行執行緒同步,所以在訪問量比較大,或者可能訪問的執行緒比較多時,採用餓漢實現,可以實現更好的效能。這是以空間換時間。

在訪問量較小時,採用懶漢實現。這是以時間換空間。

餓漢單例類

class danmaku : public base

danmaku& danmaku::instance()

下面的**表示懶漢單例類,跟具體哪種語言沒有關係。

單執行緒中:

singleton* getinstance()

這樣就可以了,保證只取得了乙個例項。但是在多執行緒的環境下卻不行了,因為很可能兩個執行緒同時執行到if (instance == null)這一句,導致可能會產生兩個例項。於是就要在**中加鎖。

singleton* getinstance()

unlock();

return instance;

}但這樣寫的話,會稍稍映像效能,因為每次判斷是否為空都需要被鎖定,如果有很多執行緒的話,就愛會造成大量執行緒的阻塞。於是大神們又想出了雙重鎖定。

singleton* getinstance()

unlock();

}return instance;

}這樣只夠極低的機率下,通過越過了if (instance == null)的執行緒才會有進入鎖定臨界區的可能性,這種機率還是比較低的,不會阻塞太多的執行緒,但為了防止乙個執行緒進入臨界區建立例項,另外的執行緒也進去臨界區建立例項,又加上了一道防禦if (instance == null),這樣就確保不會重複建立了。

常用的場景

單例模式常常與工廠模式結合使用,因為工廠只需要建立產品例項就可以了,在多執行緒的環境下也不會造成任何的衝突,因此只需要乙個工廠例項就可以了。

優點1.減少了時間和空間的開銷(new例項的開銷)。

2.提高了封裝性,使得外部不易改動例項。

缺點1.懶漢式是以時間換空間的方式。

2.餓漢式是以空間換時間的方式。

c++實現**

#ifndef _singleton_h_

#define _singleton_h_

class singleton;

#endif

#include "singleton.h"

singleton::singleton()

singleton::singleton(const singleton&)

singleton& singleton::operator=(const singleton&)

//在此處初始化

singleton* singleton::instance = new singleton();

singleton* singleton::getinstance()

#include "singleton.h"

#include

int main(){

singleton* singleton1 = singleton::getinstance();

singleton* singleton2 = singleton::getinstance();

if (singleton1 == singleton2)

fprintf(stderr,"singleton1 = singleton2\n");

return 0;

結果輸出:singleton1 = singleton2

C 的單例模式與執行緒安全單例模式(懶漢 餓漢)

1 教科書裡的單例模式 我們都很清楚乙個簡單的單例模式該怎樣去實現 建構函式宣告為private或protect防止被外部函式例項化,內部儲存乙個private static的類指標儲存唯一的例項,例項的動作由乙個public的類方法代勞,該方法也返回單例類唯一的例項。上 1 2 3 4 5 6 7...

C 的單例模式與執行緒安全單例模式(懶漢 餓漢)

單例模式 是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項。實現簡單的單例模式 建構函式宣告為private或protect防止被外部函式例項化,內部儲存乙個private static的類指標儲存唯一的例...

C 的單例模式與執行緒安全單例模式(懶漢 餓漢)

1 教科書裡的單例模式 我們都很清楚乙個簡單的單例模式該怎樣去實現 建構函式宣告為private或protect防止被外部函式例項化,內部儲存乙個private static的類指標儲存唯一的例項,例項的動作由乙個public的類方法代勞,該方法也返回單例類唯一的例項。上 1 2 3 4 5 6 7...