单例模式
2016-05-06 14:45
225 查看
单例模式是一个经常被面试官问道,并且让被面试者现场写的一个题目,单例模式主要就是让整个程序从始到终就只有一个对象存在,就像windows里面的任务管理器,在系统启动的过程中,就只能存在一个。
单利模式的书写主要就是一个静态对象,一个可以调用并生成该对象的方法,以及隐藏构造函数,拷贝构造函数,重载赋值操作符等。下面贴代码
被注释掉的那一部分是第一种方法,这种方法是在程序运行之前,静态对象就已经生成,那么就不会存在加锁的问题。
另一种方法主要是有加锁的过程,因为有使用了new来开辟新的内存来存放该对象。关于为什么会有两个if判断,主要是因为调用该方法生成对象的地方比较多,但是大多数的地方调用的时候,该对象已经生成了,所以在第一次if判后就退出了,如果只使用一次if判断的话,那么就会存在先加锁,再if判断,那么每一次调用进来就都要加锁,这样效率肯定是下降的很厉害,所以存在两次判断。关于是否释放new到的对象时,大多数人的意见都不相同,有些人说不必释放,因为从始到终就只有一个对象的存在,所以使用完后程序就已经运行完了,关于内存泄露并不能成立,但是想要在程序结束前释放他也可以,手动释放也可以,在这个类里的析构函数里再写一个类,这个类里写上析构函数,析构该对象,就可以了。
第一种方法的缺点是如果在一个动态库里面存在这样的函数,那么加载动态库时就程序已经运行起来了,那么静态对象此时才会被创建,但时如果程序是一个多线程的程序的话,该方案可能会出现漏洞。
单利模式的书写主要就是一个静态对象,一个可以调用并生成该对象的方法,以及隐藏构造函数,拷贝构造函数,重载赋值操作符等。下面贴代码
#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到的对象时,大多数人的意见都不相同,有些人说不必释放,因为从始到终就只有一个对象的存在,所以使用完后程序就已经运行完了,关于内存泄露并不能成立,但是想要在程序结束前释放他也可以,手动释放也可以,在这个类里的析构函数里再写一个类,这个类里写上析构函数,析构该对象,就可以了。
第一种方法的缺点是如果在一个动态库里面存在这样的函数,那么加载动态库时就程序已经运行起来了,那么静态对象此时才会被创建,但时如果程序是一个多线程的程序的话,该方案可能会出现漏洞。
相关文章推荐
- 近5年133个Java面试问题列表
- shell终端控制字符
- ajax request VS normal request
- Android如何计算时间差
- Android开源项目分类汇总
- linux IP地址转换及网络字节序
- BootStrap响应式导航条实例介绍
- AngularJS自定义指令详解(有分页插件代码)
- Cocos2d-x移植到安卓平台以及安卓模拟器配置
- Git里面的SSH
- 逆序建表
- UVA10285Longest Run on a Snowboard(搜索)
- zookeeper 安装笔记 3.6.7
- json不转化值是null的字段
- poj 2481 Cows(输出每头牛有几头牛比其强壮,明牛i比牛j强壮:Si <=Sjand Ej <= Ei and Ei - Si > Ej - Sj)
- 2016/05/06
- Android View 事件分发机制 源码解析 (上)
- Android Dev Intro - Android Looper And Handler
- centos下Iptables学习记录
- android开发Activity页面跳转时去除系统自带动画