单例模式

单例模式是一个经常被面试官问道,并且让被面试者现场写的一个题目,单例模式主要就是让整个程序从始到终就只有一个对象存在,就像windows里面的任务管理器,在系统启动的过程中,就只能存在一个。

单利模式的书写主要就是一个静态对象,一个可以调用并生成该对象的方法,以及隐藏构造函数,拷贝构造函数,重载赋值操作符等。下面贴代码

#include <iostream>
#include <stdio.h>
#include <pthread.h>
using namespace std;
//
//class singleton
//{
//  public:
//      static singleton *GetInstance()
//      {
//          static singleton instance;
//          return &instance;
//      }
//      void prin()
//      {
//          cout<<"hello i am singleton"<<endl;
//      }
//  private:
//      singleton()
//      {}
//      singleton(const singleton &);
//      singleton& operator=(const singleton &);//只声明不实现
//};

class singleton;

pthread_mutex_t Mutex = PTHREAD_MUTEX_INITIALIZER;


class singleton
{
    public:
        static singleton * GetInstance()
        {
            if (instance == NULL)
            {
                pthread_mutex_lock(&Mutex);
                if (instance == NULL)
                {
                    instance = new singleton();
                }
                pthread_mutex_unlock(&Mutex);
            }
            return instance;
        }
        void prin()
        {
            cout<<"hello i am a singleton"<<endl;
        }
    private:
        singleton()
        {}
        singleton(const singleton &);
        singleton & operator=(const singleton &);
    private:
        static singleton *instance;
};


singleton* singleton::instance;

int main()
{

    pthread_mutex_init(&Mutex,NULL);
    static singleton *instanced = singleton::GetInstance();
    static singleton *instance2 = singleton::GetInstance();
    printf("%x\n",&(*instanced));//the same address
    printf("%x\n",&(*instance2));
    instanced->prin();
    return 0;
}



被注释掉的那一部分是第一种方法,这种方法是在程序运行之前,静态对象就已经生成,那么就不会存在加锁的问题。

另一种方法主要是有加锁的过程,因为有使用了new来开辟新的内存来存放该对象。关于为什么会有两个if判断,主要是因为调用该方法生成对象的地方比较多,但是大多数的地方调用的时候,该对象已经生成了,所以在第一次if判后就退出了,如果只使用一次if判断的话,那么就会存在先加锁,再if判断,那么每一次调用进来就都要加锁,这样效率肯定是下降的很厉害,所以存在两次判断。关于是否释放new到的对象时,大多数人的意见都不相同,有些人说不必释放,因为从始到终就只有一个对象的存在,所以使用完后程序就已经运行完了,关于内存泄露并不能成立,但是想要在程序结束前释放他也可以,手动释放也可以,在这个类里的析构函数里再写一个类,这个类里写上析构函数,析构该对象,就可以了。

第一种方法的缺点是如果在一个动态库里面存在这样的函数,那么加载动态库时就程序已经运行起来了,那么静态对象此时才会被创建,但时如果程序是一个多线程的程序的话,该方案可能会出现漏洞。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值