C 單例模式

2021-09-10 16:34:09 字數 1979 閱讀 2535

前段時間面試時遇到乙個問題,靜態變數是否為執行緒安全的。靜態變數在編譯時進入main()函式前便進行初始化,其生命週期伴隨著整個程式的生命週期,在程式結束時才會釋放記憶體。對於靜態例項變數,其在構造的時候是執行緒安全的,構造過程中第乙個執行緒執行構造,其他執行緒會阻塞在構造的過程,然後構造完畢後該物件內部的靜態變數是非執行緒安全的,因為其共享的是乙份記憶體。

因此,在設計工具類的時候,對於沒有使用靜態變數的靜態工具類方法,是不需要加鎖的。在使用單例模式做工具類的時候,靜態方法需要被加鎖,這是因為所有的執行緒雖然有自己的方法棧,但是在方法棧中操作的是同乙個物件的實體,需要進行加鎖同步。

現在回想起來,其實面試官真正想問的問題是如何設計乙個單例模式類。

單例模式是指確保乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。

單例模式常用於系統的日誌輸出等工具類的實現。其特點如下:

優點:僅有乙個例項,減少記憶體開銷;避免對乙個資源的多重占用;設定全域性訪問點,優化和貢獻資源;

缺點:擴充套件性差;不利於測試;與單一職責原則有衝突,單例模式要把單例和業務邏輯融合在乙個類中。

懶漢模式是指只有在第一次用到類例項的時候才會去例項化。最普通的懶漢模式如下:

class singleton

static singleton* m_instance;

public:

static singleton* getinstance();

};singleton* singleton::m_instance = null;

singleton* singleton::getinstance()

return m_instance;

}

懶漢模式保證只有乙個例項是通過第一次訪問getinstance()這個函式時實現的,只有第一次訪問時才會構建物件,否則僅返回相同例項的指標。但是其會存在兩個問題:多個執行緒同時第一次訪問getinstance時會同時構造乙個例項給m_instance造成錯誤;new出來的東西沒有進行析構,導致記憶體洩漏。

在c++11中,我們可以借助call_once和unique_ptr來實現執行緒安全的單例模式,此處搬運別人的**如下:

class singleton );

return *m_instance;

} ~singleton() = default;

private:

singleton() = default;// ctor hidden

singleton(const singleton&) = delete; // copy ctor hidden

singleton& operator=(const singleton&) = delete; // assign op. hidden

private:

static std::unique_ptrm_instance;

};

其中unique_ptr智慧型指標可禁止拷貝和賦值,由於智慧型指標的特性可以避免了記憶體洩漏,call_once函式可避免getinstance在第一次時多個執行緒同時訪問時出現的同時構造的問題。

由此看來,c++11的一些特性太強大了,怪不得好幾個面試官都要問c++11的問題呢。

餓漢模式是指單例類定義的時候就進行例項化,飢不擇食。實現**如下:

class singleton

~singleton() }

static singleton* m_instance;

public:

static singleton* getinstance();

};singleton* singleton::m_instance = new singleton(); //static members initialize out of class

singleton* singleton::getinstance()

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