单例模式详解(线程安全,饿汉,懒汉模式)
单例模式
创建唯一的一个变量(对象),在类中将构造函数设为protected或者private(析构函数设为相对应的访问权限),故外部不能实例化对象,再提供访问它的一个全局访问点,即定义一个static函数,返回类中唯一构造的一个实例对象。任何条件下,保证只有一个实例对象,这就是单例。
- 线程安全:在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。
- 懒汉模式:在系统运行中,实例并不存在,只有当需要的时候才创建并使用实例。(需要考虑线程安全)可以使用静态局部变量(c++11及以上)或者需要加锁。
//如果是多线程 需要加锁
class MultiThreadSingleton
{public:~MultiThreadSingleton(){cout << "~MultiThreadSingleton()" << endl;} static MultiThreadSingleton* getInstance(){if(instance == nullptr){//初次创建时加锁pthread_mutex_lock(&mutex);instance = new MultiThreadSingleton();pthread_mutex_unlock(&mutex);}return instance;}void SingletonOP(){cout << "SingletonOP!" << endl;}private:MultiThreadSingleton(){pthread_mutex_init(&mutex,NULL);cout << "MultiThreadSingleton()" << endl;}static pthread_mutex_t mutex;static MultiThreadSingleton* instance;
};//懒汉模式 即需要的时候才去实例化对象
MultiThreadSingleton* MultiThreadSingleton::instance = nullptr;
pthread_mutex_t MultiThreadSingleton::mutex;//------------
MultiThreadSingleton* sig3 = MultiThreadSingleton::getInstance();
sig3->SingletonOP();
delete sig3;
//局部变量懒汉模式
static MultiThreadSingleton* getInstance()
{//局部变量static MultiThreadSingleton localInstance;return &localInstance;
}//-----------------------------
//懒汉局部变量MultiThreadSingleton* sig4 = MultiThreadSingleton::getInstance();MultiThreadSingleton* sig5 = MultiThreadSingleton::getInstance();sig4->SingletonOP();if(sig4 == sig5) cout << "Test!" << endl;
- 饿汉模式:指系统一运行,就初始化创建实例,当需要的时候,直接调用就行。(本身就是线程安全)
- 二者的主要区别就是创建实例的时间不同
- 使用懒汉单例时,推荐使用内部静态变量的懒汉单例,代码量少。
- 懒汉式是空间换时间,适应于访问量较少;饿汉式是时间换空间,适应于访问量较大或者线程较多时。
class MultiThreadSingleton
{public:~MultiThreadSingleton(){cout << "~MultiThreadSingleton()" << endl;} static MultiThreadSingleton* getInstance(){// if(instance == nullptr)// {// return new MultiThreadSingleton();// }return instance;}void SingletonOP(){cout << "SingletonOP!" << endl;}private:MultiThreadSingleton(){cout << "MultiThreadSingleton()" << endl;}static MultiThreadSingleton* instance;};
//饿汉模式 即在类加载时时就创建对象,适合访问量较大的时候,用空间换时间
MultiThreadSingleton* MultiThreadSingleton::instance = new MultiThreadSingleton();
单例模式详解(线程安全,饿汉,懒汉模式)相关推荐
- C++设计模式--单例模式详解(懒汉模式、饿汉模式、双重锁)
C++设计模式--单例模式详解(懒汉模式.饿汉模式.双重锁) 应用场景 一.单例模式是什么? 二.使用步骤 1.UML图 2.代码实现 应用场景 通常我们在做通讯的时候,我们跟服务器数据交互,假如每次 ...
- java connection 单例_Java设计模式之单例模式详解
Java设计模式之单例模式详解 什么是设计模式 设计模式是在大量的实践中总结和理论之后优选的代码结构,编程风格,以及解决问题的思考方式.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可 ...
- 单例模式应用场景_三、单例模式详解
4.单例模式详解 4.1.课程目标 1.掌握单例模式的应用场景. 2.掌握IDEA环境下的多线程调试方式. 3.掌握保证线程安全的单例模式策略. 4.掌握反射暴力攻击单例解决方案及原理分析. 5.序列 ...
- 以下属于单例模式的优点的是_三、单例模式详解
4.单例模式详解 4.1.课程目标 1.掌握单例模式的应用场景. 2.掌握IDEA环境下的多线程调试方式. 3.掌握保证线程安全的单例模式策略. 4.掌握反射暴力攻击单例解决方案及原理分析. 5.序列 ...
- 并发编程-09安全发布对象+单例模式详解
文章目录 脑图 概述 安全发布对象的4种方式 示例 懒汉模式(线程不安全) 饿汉模式 静态域(线程安全) 改造线程不安全的懒汉模式方式一 静态方法使用synchronized修饰 (线程安全) 改造线 ...
- Android中的单例模式(java单例模式详解,Glide,EventBus,LayoutInfalter的源码单例模式详解)
一.单例模式 (1)单例模式介绍和定义 大概意思是保证一个类在任何时候都只有一个实例在内存里,以static形式提供整个项目的访问.在Android系统中常用的地方有:创建一个SQLiteOpen ...
- Java23种设计模式之单例模式的五种实现方式、反射破解单例模式、不能破解枚举单例模式详解
源码链接(Gitee码云):https://gitee.com/oldou/javadesignpatterns 这里有我整理好的Java23种设计模式的源码以及博客教程,博客教程中介绍了Java23 ...
- 多线程下的单例模式详解
1. 单例模式 (1) 单例模式简介 (2) 实现方式 ① 饿汉式 ② 懒汉式 2. 多线程下的单例模式 (1) Synchronized (2) 双重检查锁 (3) 双重检查锁+Volatile 补 ...
- 单例模式可以分为懒汉式和饿汉式: 懒汉式单例模式:在类加载时不初始化。 饿汉式单例模式:在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快。
单例模式可以分为懒汉式和饿汉式: 懒汉式单例模式:在类加载时不初始化. 饿汉式单例模式:在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快.
- python单例模式解析_Python下简易的单例模式详解
Python 下的单例模式 要点: 1.某个类只能有一个实例: 2.它必须自行创建这个实例: 3.它必须自行向整个系统提供这个实例 方法:重写new函数 应该考虑的情况: 1.这个单例的类可能继承了别 ...
最新文章
- 浅谈Web中前后端模板引擎的使用
- PAT (Basic Level) 1075 链表元素分类(模拟)
- 干货 | SpringBoot注解大全,值得收藏
- dp主机_HDMI和DP谁才是未来主流?
- php注册树模式,PHP设计模式之详记注册树模式
- deepnode处理过的图片_教你用PS快速修复图片脏乱和瑕疵,快来一起学习吧!
- 免费素材大荟萃:免费图标和UI设计
- MySql学习之组合查询
- MFC通过CImage绘制透明图层的png图片
- VBA笔记 退出循环、Sub、Fuction等的Exit语句
- matlab portcons,马科维茨投资组合理论(均方模型)学习笔记——基于Matlab(二)...
- Sequence (矩阵快速幂+快速幂+费马小定理)
- NodeMcu arduino ESP8266 使用Ticker库(多任务处理)
- 《Computer Graphics C Version》(Donald Hearn著)总结 第五章(第一部分)
- Java中List Set Map总结
- 软件项目外包的合作流程是怎样的?
- ECL电平特点及其应用
- SpringMVC-Spring-Mybatis
- Contos7下tomcat定时重启实现
- Oracle不能用system用户 ORA-01017