C++单例模式这个东西,永远处在一个会与不会的状态之间。学生时期没搞懂的现在来还账了!
1,构造函数非受保护
2,静态数据成员的定义与初始化(因生命周期,位置不限)
3,共有静态函数,函数中判断指针是否为空,为空去创建对象。
一句话:
单例模式的作用不必多提。最多的也不过是“饿汉”,“饿汉”加锁,“懒汉”这几种。
之间一片博客中阐述过我对C++中static的看法:http://blog.youkuaiyun.com/qq_28171461/article/details/78822746
1, static是用来管理类的,找一个维度更高的来管理类的创建(当然类比对象又高一个level)( static---》类----》对象)。因为高于类,static指针变量自然可以放到类的任意权限位置(private,protect,public)。(函数同理适用)
2. 懒汉: static函数中,进行新建一个对象。并进行是否为空的判断(敲黑板,划重点)。 (懒在哪里,释义:用的时候才初始化)
有判断就存在多线程同时进入修改的情况,所以lock应运而生。 (有个双层加锁的大家可以找找,因为笨我只能是先搞功能,再优化)(饿在哪里,释义:很饿了,不用我 也把你占着,吃着碗里看着锅里)
饿汉:在static 指针初始化的时候就new对象, 这样在main中不好写代码,但是线程安全。
优异分析:
懒汉: 资源消耗是动态的,根据你的创建走。缺点在于多线程的控制,耗时!!时间换资源
饿汉:如果单例本来资源比较多,但是不需要创建那么早,就会消耗资源。资源换时间
code:
#include <iostream>
using namespace std;
class single{
private:
int x;
static single * ptr;
public:
single( int m ){
x=m;
cout<<"single()"<<"data is"<<x<<endl;
//x=m;
}
~single(){
cout<<" ~single(), the object has been erase"<<endl;
if (ptr!=NULL){
delete ptr;
}
}
static single *getinstance(int n){ //这里是懒汉的点,这样写的好处在于我可以在main中赋值。
// 加锁的操作在这里,双层加锁也在这里
if (ptr==NULL){
ptr=new single(n);
return ptr;
}else{
cout<<"the object has been create"<<endl;
}
}
};
single * single::ptr=NULL;
// single * single::ptr=new single(n); //这个是饿汉的点,不方便main中调用,但是很安全有木有。
int main (void){
single *a1=single::getinstance(3);
single *a2=single::getinstance(4);
getchar();
return 0;
}
Singleton* getInstance()
{
lock();
if (instance == NULL)
{
instance = new Singleton();
}
unlock();
return instance;
}
这样写的话,会稍稍影响性能,因为每次判断是否为空都需要被锁定(后边来的线程都得等待锁,你又不人家创建,别让人家等了。)。如果有很多线程的话,就爱会造成大量线程的阻塞。于是大神们又想出了双重锁定(我只放第一个线程进来,然后加锁,别的线程你们就别来了,也别傻等了)。Singleton* getInstance()
{
if (instance == NULL)
{
lock();
if (instance == NULL)
{
instance = new Singleton();
}
unlock();
}
return instance;
}