一句话 C++单例模式

来源:互联网 发布:自考java程序设计试题 编辑:程序博客网 时间:2024/05/21 20:43

C++单例模式这个东西,永远处在一个会与不会的状态之间。学生时期没搞懂的现在来还账了!


一句话:

单例模式的作用不必多提。最多的也不过是“饿汉”,“饿汉”加锁,“懒汉”这几种。


之间一片博客中阐述过我对C++中static的看法:http://blog.csdn.net/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;}




原创粉丝点击