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

2021-08-04 14:42:56 字數 1823 閱讀 7888

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

class singleton

private:

static singleton* p;

public:

static singleton* instance();

};singleton* singleton::p = null;

singleton* singleton::instance()

該方法是執行緒不安全的,考慮兩個執行緒同時首次呼叫instance方法且同時檢測到p是null值,則兩個執行緒會同時構造乙個例項給p,這是嚴重的錯誤!同時,這也不是單例的唯一實現!

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

懶漢:故名思義,不到萬不得已就不會去例項化類,也就是說在第一次用到類例項的時候才會去例項化,所以上邊的經典方法被歸為懶漢實現;

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

特點與選擇:

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

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

執行緒不安全,怎麼辦呢?最直觀的方法:加鎖。

方法1:加鎖的經典懶漢實現:

class

singleton

private:

static singleton* p;

public:

static pthread_mutex_t mutex;

static singleton* initance();

};pthread_mutex_t singleton::mutex;

singleton* singleton::p = null;

singleton* singleton::initance()

return p;

}

方法2:內部靜態變數的懶漢實現

此方法也很容易實現,在instance函式裡定義乙個靜態的例項,也可以保證擁有唯一例項,在返回時只需要返回其指標就可以了。  

class singleton

public:

static pthread_mutex_t mutex;

static singleton* initance();

int a;

};pthread_mutex_t singleton::mutex;

singleton* singleton::initance()

餓漢實現

餓漢實現本來就是執行緒安全的。

class singleton

private:

static singleton* p;

public:

static singleton* initance();

};singleton* singleton::p = new singleton;

singleton* singleton::initance()

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

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

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

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

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

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