C++经典面试题--单例模式
2014-10-03 18:03
337 查看
转载请注明出处
单例模式是面试到设计模式几乎一定会问道的一个设计模式,另外的一个设计模式MVC也是很常见,后续博文会继续分析MVC模式
就是一个类只返回一个对象的实体。
对象只是在第一次初始化的时候执行构造函数,进行创建。
比如:一家公司只会有一个CEO实体,任何事情都得回报给这个CEO,如果两个CEO会出现公司的管理混乱。
本文列出较较为完善的写法:
这样写考虑到了
1、多线程的线程安全:用临界区保护
2、异常安全
3、用两次if(m_sigleton == NULL)判断,第一次判断保证只有第一次需要进入临界区,以后都不需要。第二次保证,即使再第一次初始化的时候多个线程同时依次进入临界区。保证程序的高效性
测试后结果
第一次初始化,m_test 为5,print的时候+1,所以为6,第二次返回同一个对象,所以+1后输出7
转载请注明出处
单例模式是面试到设计模式几乎一定会问道的一个设计模式,另外的一个设计模式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
转载请注明出处