本篇介绍单例模式,可以说是使用场景最频繁的设计模式了。可以根据实例的生成时间,分为饿汉模式和懒汉模式

饿汉模式:饿了肯定要饥不择食。所以在单例类定义的时候就进行实例化。

懒汉模式:故名思义,不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化

一.饿汉模式

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)(二:单例模式)相关推荐

  1. 两种语言实现设计模式(C++和Java)(三:策略模式)

    策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异.用策略模式 ...

  2. 无监督方法实现C++、Java、Python 代码转换,程序员:出了bug怎么办,两种语言都要看吗?...

    点击上方"视学算法",选择加"星标" 重磅干货,第一时间送达 本文转载自:机器之心  |  参与:魔王 Facebook 提出的无监督代码转换方法 TransC ...

  3. Leetcode刷题 225题:用队列实现栈(基于Java和c++两种语言)

    ** Leetcode刷题 225题:用队列实现栈(基于Java和c++两种语言) ** 题目: 使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top( ...

  4. Java调用Python脚本:轻松实现两种语言的互操作性

    Java和Python都是非常流行的编程语言,它们都有自己的优点,但也有自己的局限性.在编写应用程序时,我们可能需要使用两种语言来共同完成一项任务.在这种情况下,Java需要调用Python脚本来解决 ...

  5. Leetcode刷题 232题:用栈实现队列(基于python3和c++两种语言)

    Leetcode刷题 232题:用栈实现队列(基于python3和c++两种语言) 题目: 使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部. pop() – 从队列首部移除元 ...

  6. Leetcode刷题 155题: 最小栈(基于python3和c++两种语言)

    ** Leetcode刷题 155题: 最小栈(基于python3和c++两种语言) ** ** 题目: ** 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. ...

  7. Leetcode刷题 1441题: 用栈操作构建数组(基于python3和c++两种语言)

    Leetcode刷题 1441题: 用栈操作构建数组(基于python3和c++两种语言) ** 题目: ** 给你一个目标数组 target 和一个整数 n.每次迭代,需要从 list = {1,2 ...

  8. 两种语言“争霸赛”,PHP速度领先C#

    译者 | 张洁 责编 | 屠敏 有人的地方就有江湖,有江湖的地方就有纷争.提起编程语言话题,总会有人想要不甘示弱地争论一番.这不,就在一位名为@withinboredom的开发者发布的一条" ...

  9. 谷歌智能助理能同时听懂两种语言 超过同类产品

    (原标题:Google Assistant can now speak two languages at once) 网易科技讯 8月31日消息,据国外媒体<连线>报道,在Siri.Ale ...

最新文章

  1. YOLOV4各个创新功能模块技术分析(二)
  2. python用selenium爬取网页数据_Python项目实战:使用selenium爬取拉勾网数据
  3. 【IOC 控制反转】Android 布局依赖注入 ( 布局依赖注入步骤 | 布局依赖注入代码示例 )
  4. ECshop商城程序常见的96个小问题汇总
  5. java token生成和验证_SpringBoot集成JWT生成token及校验方法过程解析
  6. Android 极光推送设置别名
  7. Android基本组件是什么?
  8. mysql如何分析sql执行效率和进行效率优化
  9. 常用的优化方法-梯度下降、牛顿法、坐标下降法
  10. oracle设置控制文件多路径,【备份恢复】 控制文件多路径
  11. linux重启配置文件,rEFInd启动管理器配置文件详解
  12. JavaScript中Array 对象相关的几个方法
  13. 用计算机制作简谱,雅乐简谱免费版
  14. 【转】IE内嵌google chrome frame解决浏览器兼容问题
  15. Windows+Ubuntu 搭建私有云桌面服务
  16. 关于excel表格直接引用和间接引用
  17. 运维工程师从月薪 5K 到 50K,中间都经历了什么?
  18. DataGrip 安装教程 详细版
  19. java 注解 @Deprecated
  20. 物理动画流体实现流程(Physically Based Fluid Animation)

热门文章

  1. Python中的正则表达式(re)
  2. swift学习笔记(四)关于类的继承
  3. [bzoj3527][Zjoi2014]力
  4. linux之iftop命令
  5. SSH连接原理及ssh-key
  6. box-sizing 的作用
  7. Luakit的前世今生
  8. oracle快速创建可用用户
  9. 烂泥:CentOS命令学习之scp复制
  10. 聊聊ES7与ES8特性