两种语言实现设计模式(C++和Java)(二:单例模式)
本篇介绍单例模式,可以说是使用场景最频繁的设计模式了。可以根据实例的生成时间,分为饿汉模式和懒汉模式
饿汉模式:饿了肯定要饥不择食。所以在单例类定义的时候就进行实例化。
懒汉模式:故名思义,不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化
一.饿汉模式
1.c++
线程安全,不会内存泄漏的写法:
1 class Singleton 2 { 3 protected: 4 Singleton(){} 5 ~Singleton(){ 6 if (p == NULL) return; 7 delete p; 8 p = NULL; 9 } 10 private: 11 static Singleton* p; 12 public: 13 static Singleton* getInstance(){ 14 return p; 15 } 16 }; 17 Singleton* Singleton::p = new Singleton;
2.Java
1 public class Singleton { 2 private static Singleton singleton = new Singleton(); 3 private Singleton(){} 4 public static Singleton getInstance(){ 5 return singleton; 6 } 7 }
优点:饿汉模式天生是线程安全的,使用时没有延迟。
缺点:启动时即创建实例,启动慢,有可能造成资源浪费。
二.懒汉模式
1.c++
加锁的线程安全经典懒汉模式
1 class singleton{ 2 protected: 3 singleton(){ 4 pthread_mutex_init(&mutex, 0); 5 } 6 private: 7 static singleton* p; 8 public: 9 static pthread_mutex_t mutex; 10 static singleton* initance(){ 11 if (p == NULL) 12 { 13 pthread_mutex_lock(&mutex); 14 if (p == NULL) 15 p = new singleton(); 16 pthread_mutex_unlock(&mutex); 17 } 18 return p; 19 } 20 };
2.Java
加了synchronized达到线程安全
1 public class SingletonLazier { 2 3 private static SingletonLazier uniqueInstance = null; 4 5 private SingletonLazier(){ } 6 7 public static synchronized SingletonLazier getInstance(){ 8 if(uniqueInstance == null){ 9 uniqueInstance = new SingletonLazier(); 10 } 11 return uniqueInstance; 12 } 13 }
三.Holder模式
java的实现方式,由JVM实现线程安全性
1 public class Singleton { 2 3 private static class SingletonHolder{ 4 private static Singleton instance = new Singleton(); 5 } 6 7 private Singleton(){} 8 9 public static Singleton getInstance(){ 10 return SingletonHolder.instance; 11 } 12 }
转载于:https://www.cnblogs.com/Asp1rant/p/10752859.html
两种语言实现设计模式(C++和Java)(二:单例模式)相关推荐
- 两种语言实现设计模式(C++和Java)(三:策略模式)
策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异.用策略模式 ...
- 无监督方法实现C++、Java、Python 代码转换,程序员:出了bug怎么办,两种语言都要看吗?...
点击上方"视学算法",选择加"星标" 重磅干货,第一时间送达 本文转载自:机器之心 | 参与:魔王 Facebook 提出的无监督代码转换方法 TransC ...
- Leetcode刷题 225题:用队列实现栈(基于Java和c++两种语言)
** Leetcode刷题 225题:用队列实现栈(基于Java和c++两种语言) ** 题目: 使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top( ...
- Java调用Python脚本:轻松实现两种语言的互操作性
Java和Python都是非常流行的编程语言,它们都有自己的优点,但也有自己的局限性.在编写应用程序时,我们可能需要使用两种语言来共同完成一项任务.在这种情况下,Java需要调用Python脚本来解决 ...
- Leetcode刷题 232题:用栈实现队列(基于python3和c++两种语言)
Leetcode刷题 232题:用栈实现队列(基于python3和c++两种语言) 题目: 使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部. pop() – 从队列首部移除元 ...
- Leetcode刷题 155题: 最小栈(基于python3和c++两种语言)
** Leetcode刷题 155题: 最小栈(基于python3和c++两种语言) ** ** 题目: ** 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. ...
- Leetcode刷题 1441题: 用栈操作构建数组(基于python3和c++两种语言)
Leetcode刷题 1441题: 用栈操作构建数组(基于python3和c++两种语言) ** 题目: ** 给你一个目标数组 target 和一个整数 n.每次迭代,需要从 list = {1,2 ...
- 两种语言“争霸赛”,PHP速度领先C#
译者 | 张洁 责编 | 屠敏 有人的地方就有江湖,有江湖的地方就有纷争.提起编程语言话题,总会有人想要不甘示弱地争论一番.这不,就在一位名为@withinboredom的开发者发布的一条" ...
- 谷歌智能助理能同时听懂两种语言 超过同类产品
(原标题:Google Assistant can now speak two languages at once) 网易科技讯 8月31日消息,据国外媒体<连线>报道,在Siri.Ale ...
最新文章
- YOLOV4各个创新功能模块技术分析(二)
- python用selenium爬取网页数据_Python项目实战:使用selenium爬取拉勾网数据
- 【IOC 控制反转】Android 布局依赖注入 ( 布局依赖注入步骤 | 布局依赖注入代码示例 )
- ECshop商城程序常见的96个小问题汇总
- java token生成和验证_SpringBoot集成JWT生成token及校验方法过程解析
- Android 极光推送设置别名
- Android基本组件是什么?
- mysql如何分析sql执行效率和进行效率优化
- 常用的优化方法-梯度下降、牛顿法、坐标下降法
- oracle设置控制文件多路径,【备份恢复】 控制文件多路径
- linux重启配置文件,rEFInd启动管理器配置文件详解
- JavaScript中Array 对象相关的几个方法
- 用计算机制作简谱,雅乐简谱免费版
- 【转】IE内嵌google chrome frame解决浏览器兼容问题
- Windows+Ubuntu 搭建私有云桌面服务
- 关于excel表格直接引用和间接引用
- 运维工程师从月薪 5K 到 50K,中间都经历了什么?
- DataGrip 安装教程 详细版
- java 注解 @Deprecated
- 物理动画流体实现流程(Physically Based Fluid Animation)