单例模式作为创建型模式的一种,实现看起来比较简单(但却有很多问题需要注意),只是将对象的构造函数声明为private,这样类的外部就无法直接通过构造函数进行实例化。再定义一个静态成员函数对构造函数进行引用,只要在实例化前,进行判断,就能保证单例。同时注意的是,最好将拷贝构造函数和赋值构造函数也声明为private,同时静态成员函数。
上面是单线程的情况下,在多线程下设想一下,如果有两个线程同时过了判断,接下来实例化就不符合单一原则,所以在多线程下就必须加锁,由于这个比较重要所以贴了段代码进行说明:
tinyLog *tinyLog::GetInstance()
{
if(NULL == log)
{//double check
llock.lock();
if(NULL == log)
{
log = new tinyLog();
}
llock.unlock();
}
return log;
}
可以看出我们进行了两次的判断,这是因为假设,两个线程都通过了第一个判断,这时只有获得锁的那个,能创建实例而另一个是挂起的,后来第二个获得了锁,由于刚才第二个线程已经通过了第一个判断,如果没有了第二个判断,那么第二个线程也能创建实例也就不符合单例原则了。