C++实现一个单例模式(懒汉与饿汉)
来源:互联网 发布:淘宝印度大麻种子 编辑:程序博客网 时间:2024/06/05 06:10
单例模式的特点:
1、一个类只能有一个实例。
2、一个类必须自己创建自己的唯一实例。
3、一个类必须给所有其他对象提供这一实例。
单例模式的实现:
1、将构造函数声明为private防止被外部函数实例化;
2、包含一个静态私有类指针sig和静态公有方法instance();
3、instance方法负责检验并实例化自己,然后存储在静态类指针sig中,以确保只有一个实例被创建。
参考代码
class singleton{ //构造函数声明为私有的private: singleton() {} //静态私有类指针private: static singleton *sig; //静态公有方法public: static singleton* instance() { if (sig == NULL) sig = new singleton(); return sig; }};
如上方法是线程不安全的,如果两个线程同时首次调用instance方法且同时检测到p是NULL值,则两个线程会同时构造一个实例给p,这样是错误的。
饿汉模式与懒汉模式
懒汉:在第一次用到类实例的时候才会去实例化,所以上边的方法被归为懒汉实现。
饿汉:饿了肯定要饥不择食。所以在单例类定义的时候就进行实例化。
优缺点:
访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,以空间换时间。
访问量较小时,采用懒汉实现。以时间换空间。
线程安全的懒汉实现:
1、加锁
class singleton{private: singleton() { pthread_mutex_init(&lock); }private: static singleton *sig; static pthread_mutex_t lock;public: static singleton* instance() { if (sig == NULL) { pthread_mutex_lock(&lock); if (sig == NULL) sig = new singleton(); pthread_mutex_unlock(&lock); } return sig; }};
2、内部静态变量
class singleton{private: singleton() { pthread_mutex_init(&lock); }public: static pthread_mutex_t lock; int p;public: static singleton* instance() { pthread_mutex_lock(&lock); static singleton sig; pthread_mutex_unlock(&lock); } return &sig; }};
饿汉的实现
在instance函数里定义一个静态的实例,也可以保证拥有唯一实例,在返回时只需要返回其指针.
饿汉本身就是安全的。
class singleton{protected: singleton() {}private: static singleton *sig;public: static pthread_mutex_t lock;public: sig=new singleton; static singleton* instance() { return sig; }};
阅读全文
0 0
- C++实现一个单例模式(懒汉与饿汉)
- 单例模式(懒汉模式与饿汉模式)
- 单例模式之 --饿汉模式与懒汉模式
- 设计模式:单例模式,懒汉与饿汉
- 单例模式---懒汉与饿汉模式和静态内部类实现
- 单例模式(饿汉模式和懒汉模式)
- 单例模式(饿汉模式和懒汉模式)
- 单例模式 懒汉实现和饿汉实验
- 单例设计模式(饿汉模式与懒汉模式)
- Java 单例模式【懒汉与饿汉】
- 设计模式C++实现(4)——饿汉懒汉之单例模式
- [C#] 静态方式实现的单例是不是懒汉模式?
- 单例设计模式-懒汉饿汉
- JAVA单例设计模式(饿汉懒汉)
- 单例设计模式(C#) 懒汉模式
- C++单例模式(懒汉和饿汉)与线程安全
- 设计模式——单例模式之“饿汉模式”与“懒汉模式”
- 设计模式之单例模式,懒汉模式与饿汉模式
- Mvc接收Json数据,C#模拟Http请求收不到数据
- python 爬虫视频网站
- web 安全
- 配置redhat yum 163源和zabbix源 并安装zabbix-agent
- hdoj 1062
- C++实现一个单例模式(懒汉与饿汉)
- HDU1011
- 可靠数据传输原理(下)
- 算法学习笔记--6.trailing-zeros
- java: 多进程简易操作
- 论文笔记一Temporal Segment Networks: Towards Good Practices for Deep Action Recognition
- HDOJ1671 字典树入门题+模板程序(指针实现)
- 数论&&组合数学_模板
- centos7 搭建git2.11.0和gitosis服务