一句话 C++单例模式

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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值