C++經典面試題--單例模式
阿新 • • 發佈:2019-01-04
轉載請註明出處
單例模式是面試到設計模式幾乎一定會問道的一個設計模式,另外的一個設計模式MVC也是很常見,後續博文會繼續分析MVC模式
就是一個類只返回一個物件的實體。
物件只是在第一次初始化的時候執行建構函式,進行建立。
比如:一家公司只會有一個CEO實體,任何事情都得回報給這個CEO,如果兩個CEO會出現公司的管理混亂。
本文列出較較為完善的寫法:
這樣寫考慮到了
1、多執行緒的執行緒安全:用臨界區保護
2、異常安全
3、用兩次if(m_sigleton == NULL)判斷,第一次判斷保證只有第一次需要進入臨界區,以後都不需要。第二次保證,即使再第一次初始化的時候多個執行緒同時依次進入臨界
#include "stdafx.h" #include <Windows.h> #include <iostream> using namespace std; class HwcHelpClass { private: CRITICAL_SECTION m_cs; public: HwcHelpClass() { InitializeCriticalSection(&m_cs); } void lock() { EnterCriticalSection(&m_cs); } void unlock() { LeaveCriticalSection(&m_cs); } ~HwcHelpClass() { DeleteCriticalSection(&m_cs); } }; class HwcSignleton { private: HwcSignleton(); int m_test; public: static HwcSignleton * m_singleton; static HwcHelpClass *hc; static HwcSignleton * GetInstance(); void test(); ~HwcSignleton(); }; void HwcSignleton::test() { ++m_test; cout<<m_test<<endl; } HwcSignleton::HwcSignleton() { m_test = 5; } HwcSignleton * HwcSignleton::m_singleton = 0; HwcHelpClass * HwcSignleton::hc = 0; HwcSignleton * HwcSignleton::GetInstance() { if (m_singleton == NULL) { hc = new HwcHelpClass(); hc->lock(); if (m_singleton == NULL) { m_singleton = new HwcSignleton(); } hc->unlock(); } return m_singleton; } int _tmain(int argc, _TCHAR* argv[]) { HwcSignleton * exp1 = HwcSignleton::GetInstance(); exp1->test(); HwcSignleton* exp2 = HwcSignleton::GetInstance(); exp2->test(); }
測試後結果
第一次初始化,m_test 為5,print的時候+1,所以為6,第二次返回同一個物件,所以+1後輸出7
轉載請註明出處