为什么叫它单身汉模式?

1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。

看到没?自给自足。

俗话说,“小富靠勤,中富靠德,大富靠命”。单身汉也有懒惰的和勤劳的。

1.懒汉模式(延迟加载)

延迟加载就是调用get()方法时实例才被创建(先不急着实例化出对象,等要用的时候才给你创建出来。不着急,故又称为“懒汉模式”),常见的实现方法就是在get方法中进行new实例化。。

通俗理解:火车上到饭点了,懒汉在喇叭吆喝:谁要吃饭,大盘鸡,热干面,拍黄瓜和皮蛋。想要吃的来我这说一声哈,我给你new出来。现吃先做,热乎的。

public class Singleton {// 将自身实例化对象设置为一个属性,并用static修饰private static Singleton instance;// 构造方法私有化private Singleton() {}// 静态方法返回该实例public static Singleton getInstance() {if(instance == null) {instance = new Singleton();}return instance;}
}

“懒汉”的优缺点:

优点:实现起来比较简单,当类SingletonTest被加载的时候,静态变量static的instance未被创建并分配内存空间,当getInstance方法第一次被调用时,初始化instance变量,并分配内存,因此在某些特定条件下会节约了内存。

缺点:在多线程环境中,懒汉根本应付不来,根本不能保证单例的状态。

2.饿汉模式(立即加载 )

立即加载就是使用类的时候已经将对象创建完毕(不管以后会不会使用到该实例化对象,先创建了再说。很着急的样子,故又被称为“饿汉模式”),常见的实现办法就是直接new实例化。

通俗理解:还是火车上,饿汉吆喝道:啤酒饮料矿泉水,花生瓜子八宝粥。来,腿收一下了啊。想吃热干面?我这有,已经做好了。打开立马可以吃!

public class Singleton {// 将自身实例化对象设置为一个属性,并用static、final修饰private static final Singleton instance = new Singleton();// 构造方法私有化private Singleton() {}// 静态方法返回该实例public static Singleton getInstance() {return instance;}
}

“饿汉”的优缺点:

优点:实现起来简单,没有多线程同步问题。

缺点:占地方,推车就那么大一点。当类SingletonTest被加载的时候,会初始化static的instance,静态变量被创建并分配内存空间,从这以后,这个static的instance对象便一直占着这段内存(即便你还没有用到这个实例),当类被卸载时,静态变量被摧毁,并释放所占有的内存,因此在某些特定条件下会耗费内存。

3.线程安全的懒汉模式

public class Singleton {// 将自身实例化对象设置为一个属性,并用static修饰private static Singleton instance;// 构造方法私有化private Singleton() {}// 静态方法返回该实例,加synchronized关键字实现同步public static synchronized Singleton getInstance() {if(instance == null) {instance = new Singleton();}return instance;}
}

优点:在多线程情形下,保证了“懒汉模式”的线程安全。

缺点:众所周知在多线程情形下,synchronized方法通常效率低,显然这不是最佳的实现方案。

4.DCL双检查锁机制(DCL:double checked locking)

public class Singleton {// 将自身实例化对象设置为一个属性,并用static修饰private static Singleton instance;// 构造方法私有化private Singleton() {}// 静态方法返回该实例public static Singleton getInstance() {// 第一次检查instance是否被实例化出来,如果没有进入if块if(instance == null) {synchronized (Singleton.class) {// 某个线程取得了类锁,实例化对象前第二次检查instance是否已经被实例化出来,如果没有,才最终实例出对象if (instance == null) {instance = new Singleton();}}}return instance;}
}

是单例模式的最佳实现方式。内存占用率高,效率高,线程安全,多线程操作原子性。

参考文档:https://www.cnblogs.com/binaway/p/8889184.html

单例模式--“啤酒饮料矿泉水,花生瓜子八宝粥。 来,腿收一下了啊。”相关推荐

  1. 梅森素数、猜年龄、啤酒饮料、武功秘籍、调和级数、李白打酒、猜字母、扩散、三升序列、寻找2020

    梅森素数 题目 如果一个数字的所有真因子之和等于自身,则称它为"完全数"或"完美数" 例如:6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 + ...

  2. 3D啤酒饮料冷冻柜模型

    3D啤酒饮料冷冻柜模型素材,红动中国提供3D啤酒饮料冷冻柜模型设计素材下载.格 式:max,大 小:3.01 MB.欢迎优秀设计师到红动中国销售原创设计稿赚钱. 饮料类物品柜3D模型素材,红动中国提供 ...

  3. 全球与中国啤酒饮料灌装设备市场深度研究分析报告

    [报告篇幅]:133 [报告图表数]:174 [报告出版时间]:2021年1月 报告摘要 2019年,全球啤酒饮料灌装设备市场规模达到了xx亿元,预计2026年将达到xx亿元,年复合增长率(CAGR) ...

  4. C语言-啤酒饮料问题

    C语言的啤酒饮料问题 文章目录 C语言的啤酒饮料问题 前言 一.题目要求 二.作答步骤 1.思路 2.代码演示 前言 作为一个物联在读生,C语言是我们必学的一科,今天分享的是"啤酒饮料问题& ...

  5. 花生瓜子矿泉水,几点认知思考和大家唠唠

    站好最后一班岗,今天呱哥也终于放假了. 快过年了,咱也不分享啥产品干货了,今天我在车上就和大家闲聊闲聊. 关于社交 很多产品同学加我之后,不打招呼. 或者也没有自我介绍,有的人只是介绍一个名字就没有了 ...

  6. 百钱买白鸡与啤酒饮料

    第一题  标题:啤酒和饮料       啤酒每罐2.3元,饮料每罐1.9元.小明买了若干啤酒和饮料,一共花了82.3元.       我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒.   ...

  7. C++面试 select poll epoll之间的区别

    目录 摘要 场景描述 Select poll epoll 总结 摘要 先明确几个概念: 面试官问:给我讲讲什么事同步阻塞.异步阻塞.同步非阻塞.异步非阻塞. 我:????? 同步和异步的概念 同步是指 ...

  8. 万万没想到,我居然在机器人大会遇到了这些奇葩物种

    郭一璞 发自 亦庄  量子位 报道 | 公众号 QbitAI 世界机器人大会,这两天又开幕了,今年已经是第五届了. 在本届大会的机器人展区,对比每年展出的机器人,你总能嗅到机器人这个领域的一丝味道. ...

  9. 有位置,来,搬个小板凳,喝酒听故事!

    本文大概 1700字 阅读需要 5分钟 欢迎进来,容我给你搬个小板凳,坐下喝酒边听音乐边听故事吧.全程无痛点,世与俗,共敬之.认真扯淡,认真生活! 今天我大学的死党兄弟小白带着媳妇来西安逛,你要知道从 ...

最新文章

  1. c语言文件操作中换行,关于文件操作,碰到空格就换行
  2. Mac安装Dart的SDK
  3. JavaScript中的预解析(变量提升)介绍!
  4. BZOJ2730 HNOI2012 矿井搭建 连通性
  5. 如何写出优雅的异常处理
  6. 手机基带芯片激荡 30 年!
  7. Android 获取手机号及运营商信息
  8. colormap保存 matlab_matlab中自定义colormap的保存与调用
  9. 全社会有效需求不足分析
  10. 三调数据库标注插件v1.2
  11. 4571: [Scoi2016]美味
  12. numpy.array函数详解
  13. umass计算机硕士,麻省旗舰马萨诸塞大学阿默斯特分校 计算机科学强势
  14. ubuntu20 从wine安装到微信3的使用(解决微信乱码、无法输入)
  15. android studio 设备调试及Logcat查看
  16. Bucket、Hash Chain List
  17. 中高级Java面试题解析,剑指BATJ,提前祝大家程序员节快乐
  18. 轻武宽带认证计费系统白皮书2019
  19. “'react-scripts' 不是内部或外部命令,也不是可运行的程序或批处理文件。”解决方法
  20. 【js特效】图片循环滚动代码

热门文章

  1. 【招聘直通车】美团基础技术部诚招各岗位工程师
  2. 阿里云双11大促成绩单 1天超过第二云厂商半年营收?
  3. python程序员能做什么副业好_别跟钱过不去,程序员你真的应该做点副业
  4. 【调剂】航天恒星科技有限公司(原航天五院503所)2023年硕士研究生招生调剂通知...
  5. redmine无法安装mysql_redmine 1.2.1安装和安装会出现的问题
  6. YZ-9770卫星信号安全防护装置-授时安全防护装置
  7. 游戏建模学习选择Max还是Maya呢?场景建模用哪个?
  8. 非接触式IC卡(M1卡)性能简介
  9. 接口技术课程设计 Lab8000实现交通灯控制系统
  10. 今日头条自媒体矩阵运营攻略