C 單例模式

2021-09-28 15:35:35 字數 3307 閱讀 1541

1 教科書裡的單例模式

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

上**: 

2 懶漢與餓漢這是乙個很棒的實現,簡單易懂。但這是乙個完美的實現嗎?不!該方法是執行緒不安全的,考慮兩個執行緒同時首次呼叫instance方法且同時檢測到p是null值,則兩個執行緒會同時構造乙個例項給p,這是嚴重的錯誤!同時,這也不是單例的唯一實現!

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

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

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

特點與選擇:

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

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

3 執行緒安全的懶漢實現

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

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

此方法也很容易實現,在instance函式裡定義乙個靜態的例項,也可以保證擁有唯一例項,在返回時只需要返回其指標就可以了。推薦這種實現方法,真得非常簡單。方法2:內部靜態變數的懶漢實現

#pragma once

#include#include#include/*

the point of ther

*/class singleton_test

~singleton_test()

static singleton_test *m_obj;

static boost::mutex m_mutex;

public:

singleton_test* getinstance(); };

//singleton_test* singleton_test::m_obj = new singleton_test();

singleton_test* singleton_test::m_obj =null ;

boost::mutex singleton_test::m_mutex;

singleton_test* singleton_test::getinstance()

std::cout << "get the sinleton .." << std::endl;

return m_obj;

}

為什麼我不講「執行緒安全的餓漢實現」?因為餓漢實現本來就是執行緒安全的,不用加鎖。為啥?自己想!4 餓漢實現

#pragma once

#include#include#include/*

the point of ther

*/class singleton_test

~singleton_test()

static singleton_test *m_obj;

static boost::mutex m_mutex;

public:

singleton_test* getinstance(); };

singleton_test* singleton_test::m_obj = new singleton_test();

boost::mutex singleton_test::m_mutex;

singleton_test* singleton_test::getinstance()

std::cout << "get the sinleton .." << std::endl;

return m_obj;

}

C 單例模式

include using namespace std 單例類的c 實現 class singleton 構造方法實現 singleton singleton void singleton setvar int var main int main int argc,char argv return ...

C 單例模式

實現方式一 include template typename t class singleton boost noncopyable static void init private static pthread once t ponce statict value template typena...

C 單例模式

效率有點低,但是還算安全的單例模式,靜態成員實現方式 class singleton public static singleton getinstance singleton singleton getinstance unlock return m instance 內部靜態例項的懶漢模式,c ...