直接就可以在靜態區初始化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...