Creational.SingletonPattern单例模式:垃圾回收+线程安全

//保证一个类仅有一个实例,同时提供能对该实例加以访问的全局访问方法。


//******************************************************************
class CSingle{
public:
    //提供全局访问的访问点
    static CSingle* GetInst();
private:
    CSingle();//将构造函数设为私有属性
    static CSingle* pInst;
    //内部类,用于垃圾回收
    class CDestroy{//全局静态变量,会被自动销毁,从而实现对单例的垃圾回收
    public:
        ~CDestroy();
    };
    static CDestroy oDestroy;
    
    class CLock{
    private:
        HANDLE hMutex;
    public:
        CLock();
        ~CLock();
        void Lock();
        void Unlock();
    };
    static CLock oLock;

};



CSingle::CLock::CLock(){ hMutex = CreateMutex(NULL, FALSE, NULL); }
CSingle::CLock::~CLock() { CloseHandle(hMutex);}
void CSingle::CLock::Lock(){ WaitForSingleObject(hMutex, INFINITE);}
void CSingle::CLock::Unlock(){ ReleaseMutex(hMutex);}
    //******************************************************************
//提供全局访问的访问点
CSingle* CSingle::GetInst(){
    //static CSingleton instance;return &instance;
    if(NULL == pInst){
        pInst = new CSingle(); printf("new pInst;\n");
    }
    return pInst;
}

CSingle::CSingle(){}//将构造函数设为私有属性
CSingle* CSingle::pInst = NULL;
//内部类,用于垃圾回收
CSingle::CDestroy::~CDestroy(){
    if(pInst != NULL){//在这里销毁资源,比如数据库连接,句柄等。
        oLock.Lock();
        if(pInst != NULL){
            delete pInst; pInst = NULL; printf("delete pInst;\n");
        }
        oLock.Unlock();
    }
}
CSingle::CDestroy CSingle::oDestroy;
CSingle::CLock CSingle::oLock;


//客户端测试

void main()
{
    CSingle* pInst1 = CSingle::GetInst();
    CSingle* pInst2 = CSingle::GetInst();

    printf("pInst1 = %p, pInst2 = %p. ", pInst1, pInst2);

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值