单例模式

单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。

比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

单例模式的运用场景

  • 外部资源:每台计算机有若干个打印机,但只能有一个PrinterSpooler,以避免两个打印作业同时输出到打印机。
  • Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗?
  • 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。

    实现单例模式的方法思路

一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);

当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。

同时我们 还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。

实现单例模式的方式

01懒汉单例式

  • 天生线程不安全:这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。


  • 天生线程不安全:这种方式具备很好的 lazy loading,能够在多线程中很好的工作,但是,效率很低,99% 情况下不需要同步。

02饿汉单列式

这种方式比较常用,但容易产生垃圾对象。


image
​​​
image
​​

03静态内部类的方式

这种方式能达到双检锁方式一样的功效,但实现更简单。对静态域使用延迟初始化,应使用这种方式而不是双检锁方式。这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。

04枚举

这种实现方式还没有被广泛采用,但这是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,绝对防止多次实例化。

资源加载和性能区别
饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成。

而懒汉式,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,如果要做的工作比较多,性能上会有些延迟,之后就和饿汉式一样了。

静态内部类的方式资源利用率高,但第一次加载时反应不够快;java中饿单例模式性能优于懒单例模式,若对资源十分在意可以采用静态内部类。

转载于:https://blog.51cto.com/14207296/2376738

看到“java单例模式”脑壳疼,学会这几招分分钟搞定相关推荐

  1. 如何在Excel表格中输入分数?学会这几招轻松搞定!

    大家知道如何在Excel中输入分数吗?前段时间一个朋友输入数据时,发现数据中有分数,可把它给难住了,弄了半天弄不好,最后找到了小编:今天小编给大家分享几种Excel表格中输入分数的方法,希望能帮助到你 ...

  2. java 简单的调用类_java 调用 C# 类库搞定,三步即可,可以调用任何类及方法,很简单,非常爽啊...

    java 调用 C# 类库搞定,三步即可,可以调用任何类及方法,很简单,非常爽啊 java 调用 C# 类库搞定,可以调用任何类及方法,很简单,非常爽啊 总体分三步走: 一.准备一个 C# 类库 (d ...

  3. 使用百度API,分分钟搞定身份证正反面图片中的文字识别(Java代码实现)

    今天时间比较宽松,简单学习了一下百度AI开发平台中的身份证中文字识别,10来分钟就搞定了,百度API就是厉害,简单写下,做个备忘. 下载整个项目源码. 一.注册百度账号及新增一个应用,获取百度API所 ...

  4. 13天搞定java_[Java基础] 魔乐科技教你13天搞定JAVA系列高端教程 视频教程 教学视频...

    资源介绍 课程目录:                            <魔乐科技教你13天搞定JAVA>第八天-01异常的捕获及处理.rar        58.04 MB < ...

  5. 易查分怎么上传成绩?学会这个技巧,轻松搞定

    当使用易查分制作查询系统时,许多老师可能对于如何上传成绩感到困惑.有时候,导入成绩到易查分系统后,信息可能无法完全显示,而且也很难找到错误的原因.因此,今天我将与老师们分享一下易查分上传成绩的方法.这 ...

  6. Java常问面试题整理,帮你搞定‘金9银10’(附答案纯干货)

    前言: 工作做螺丝钉,面试造火箭,我想这个是每个程序员比较头疼的事情,但是又有必须经历的流程,尤其是摸不清面试官问的问题,准备不充分,导致面试的时候不知道如何回答.本文是小编个人从几十次面试中挑选的面 ...

  7. java读取文件路径中文,分分钟搞定!

    一.对象的实例化 1.创建对象的方式 new:最常见的方式(本质是构造器) 变形1 : Xxx的静态方法 变形2 : XxBuilder/XxoxFactory的静态方法 Class的newInsta ...

  8. python这个软件学会能做什么工作-不要再复制粘贴了 !学会Python,分分钟搞定一整天的工作...

    上周末,好友小晶告诉我她想辞职了. 小晶在深圳一家电商公司做了 2 年的市场运营,为了更好的完成业绩,每天都赶着最后一班地铁回家. 虽然她才毕业 2 年,不过算上加班时长,我说她工作了 3 年真的不过 ...

  9. java中ofd文件转pdf_word文件转pdf怎么转?这一招轻松搞定Word转PDF

    word文件转pdf怎么转?在自己电脑中编辑好的Word文档,在其他人的电脑中打开总出现文件内容乱码的情况,这是由于文件设备不兼容导致的.解决这个问题的最好方法就是将Word转换成PDF文件,可以提高 ...

最新文章

  1. 【Smart_Point】动态内存与智能指针实战:文本查询程序(设计set,map,智能指针的应用)
  2. 《精通自动化测试框架设计》—第2章 2.3节测试数据交互基本方法
  3. tomcat配置多个web网站的配置详解
  4. 加油站(暴力+贪心)
  5. 详述白盒测试逻辑覆盖法的语句覆盖及其缺点
  6. views视图函数-模板语法
  7. wikioi 1688 求逆序对
  8. c语言变长数组参数,使用gdb跟踪C语言中变长数组的实现
  9. Design and Model Analysis of the E-Commerce Development Platform for 3-Tiered Web Applications
  10. 计算机内存体系与Java 内存模型
  11. 形容人的内核是什么意思_【得到】人人都需要的精准表达术-老光
  12. Excel VBA 小程序 - 文本型数字转为数值型数字
  13. canvas实现粒子特效
  14. 【机器学习】深度学习框架是什么?有哪些?如何选择?
  15. 某程序员因准点下班没加班,被劝退!网友:还有没有天理?
  16. Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
  17. Options, Futures and Other Derivatives 读书笔记(三)—— CHP4
  18. ASEMI整流桥MB10S参数,MB10S封装,MB10S规格书
  19. android 固定launcher,android 开机默认进入指定Launcher
  20. win7桌面图标突然消失,鼠标右键不管用―解决

热门文章

  1. 关于开机出现“安装程序正在为首次使用计算机做准备”的解决方案及微软OOBE与SYSPREP的实用技巧
  2. 社招进京东真的很难吗?小伙毕业2年有幸获得京东内推,3面技术官直接拿下offer!
  3. dnf服务器合并信息,《龙与地下城OL》整体服务器合并计划
  4. i2c驱动之i2c-dev驱动
  5. Django7-2.模板系统常用知识点(2)
  6. iphone忘记锁屏密码如何解决
  7. 批处理是什么?能干什么?
  8. idea Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Progra
  9. 管理员权限功能和开机自启功能
  10. 喜来登“手牵手”家庭计划率先亮相大中华区13家度假酒店