设计模式:单例模式

单例模式作为创建型模式的一种,实现看起来比较简单(但却有很多问题需要注意),只是将对象的构造函数声明为private,这样类的外部就无法直接通过构造函数进行实例化。再定义一个静态成员函数对构造函数进行引用,只要在实例化前,进行判断,就能保证单例。同时注意的是,最好将拷贝构造函数和赋值构造函数也声明为private,同时静态成员函数。

 上面是单线程的情况下,在多线程下设想一下,如果有两个线程同时过了判断,接下来实例化就不符合单一原则,所以在多线程下就必须加锁,由于这个比较重要所以贴了段代码进行说明:

tinyLog *tinyLog::GetInstance()  
{  
    if(NULL == log)  
    {//double check  
        llock.lock();  
        if(NULL == log)  
        {  
            log = new tinyLog();  
        }  
        llock.unlock();  
    }  
    return log;  
}  
  
可以看出我们进行了两次的判断,这是因为假设,两个线程都通过了第一个判断,这时只有获得锁的那个,能创建实例而另一个是挂起的,后来第二个获得了锁,由于刚才第二个线程已经通过了第一个判断,如果没有了第二个判断,那么第二个线程也能创建实例也就不符合单例原则了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值