您的位置:首页 > 其它

单例模式

2016-05-06 14:45 225 查看
单例模式是一个经常被面试官问道,并且让被面试者现场写的一个题目,单例模式主要就是让整个程序从始到终就只有一个对象存在,就像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到的对象时,大多数人的意见都不相同,有些人说不必释放,因为从始到终就只有一个对象的存在,所以使用完后程序就已经运行完了,关于内存泄露并不能成立,但是想要在程序结束前释放他也可以,手动释放也可以,在这个类里的析构函数里再写一个类,这个类里写上析构函数,析构该对象,就可以了。

第一种方法的缺点是如果在一个动态库里面存在这样的函数,那么加载动态库时就程序已经运行起来了,那么静态对象此时才会被创建,但时如果程序是一个多线程的程序的话,该方案可能会出现漏洞。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: