1.什么是单例模式

一个类只有一个实列,并且提供一个对外访问该实例的全局访问点。

常见应用场景:数据库连接池,项目中读取配置文件的类,servlet也是单列,Spring中的Bean默认也是单列

2.单例模式好处

  • 由于单例模式仅有一个实例,对系统来说性能开销较小,如:应用程序启动读取配置文件时,可以产生一个单列对象,使其驻留在内存中。
  • 单列模式存在对外全局访问点,可以优化环境共享资源的访问。

3.常用单例模式

  1. 饿汉式
  2. 懒汉式
  3. 双重检查锁
  4. 静态内部类
  5. 枚举类

一般情况下,大家知道前两个已经基本ok了,如果再拿后三个跟面试管去“砍”,相信他会对你另眼相看。

  • 饿汉式(线程安全,访问效率高,不能赖加载)

  • 懒汉式(线程安全,访问效率低,可以懒加载)

  • 双重检查锁

  • 静态内部类(推荐使用)

  • 枚举类(基于JVM底层实现,天然线程安全,不能延迟加载)

4.性能对比

测试代码:

五种单列模式耗时如下:

说明:以下只是相对测试结果,机器配置不同可能测试结果有出入。

单列模式名

耗时

饿汉式 14ms
懒汉式 4404ms
双重检查锁 18ms
静态内部类 16ms
单例 15ms

GOF23-单列模式的更多相关文章

  1. Java 单列模式(Singleton)

    单例模式(Singleton) 定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 目的:使得类的一个对象成为系统中的唯一实例. 如何保证一个类只有一个实例并且这个实例易于被访问呢? 我们都 ...

  2. 在JAVA和android中常用的单列模式

    在很多开发中,项目为了节约资源,都把一个类的构造函数变为私有化,这样整个项目中就不能创建多个实例,这样的方法我们称为单例模式 现在通过代码来简介下这个单例模式: 在新建一个java项目后,创建一个实体 ...

  3. 单列模式(data与business交互)

    public class CommentsBusiness //Business { #region 单列模式 private static CommentBusiness instance; pri ...

  4. 23种设计模式学习一(单列模式)singleton

    单列模式的类(单线程下的) class Singleton { private static Singleton instance; private Singleton() { } public st ...

  5. java设计模式--单列模式

    java设计模式--单列模式 单列模式定义:确保一个类只有一个实例,并提供一个全局访问点. 下面是几种实现单列模式的Demo,每个Demo都有自己的优缺点: Demo1: /** * 单列模式需要满足 ...

  6. java基础语法(二)--单列模式

    java基础语法(二)--单列模式 /** * 功能:单列模式 * @author Administrator * */ public class SingletonTest { public sta ...

  7. java基础(三):反射、反序列化破解单列模式和解决方式

    单例模式指的是一个类只有一个对象,通过一些措施达到达到这个目的.但是反射和反序列化可以获得多个不同的对象. 先简单的认识一下单例模式 一:单例模式 通过私有构造器,声明一个该类的静态对象成员,提供一个 ...

  8. 单列模式,装饰器、new方法、类/静态方法实现单列模式

    一.单列模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在. 如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 C ...

  9. Java单列模式

    设计模式 单列模式的定义和作用 目的:使得类的一个对象成为该类系统中的唯一实列: 定义:一个类有且仅有一个实例,并且自行实列化向整个系统提供?: 单列模式分为 恶汉式  (在创建对象的时候就直接初始化 ...

  10. php基础设计模式 注册树模式、工厂模式、单列模式

    废话不多说了,先给大家介绍注册树模式然后介绍工厂模式最后给大家介绍单列模式,本文写的很详细,一起来学习吧. php注册树模式 什么是注册树模式? 注册树模式当然也叫注册模式,注册器模式.之所以我在这里 ...

随机推荐

  1. MacOS使用GitBook制作电子书

    目录 目录 一.简介 二.安装 1. 安装node.js 2. 安装gitbook 三.使用 四.常用命令 1. 初始化 或 编辑目录 2. 编辑内容之后编译书籍 3. 启动web服务通过浏览器预览数 ...

  2. Java编程思想:I/O的典型使用方式

    import java.io.*; public class Test { public static void main(String[] args) { // BufferedInputFile. ...

  3. MLlib特征变换方法

    Spark1.6.2.2.3 PCA 算法介绍: 主成分分析是一种统计学方法,它使用正交转换从一系列可能相关的变量中提取线性无关变量集,提取出的变量集中的元素称为主成分.使用PCA方法可以对变量集合进 ...

  4. Python学习4——条件、循环及其他语句总结

    多种语句 打印语句: 导入语句: 赋值语句: 代码块: 条件语句: 断言: 循环: 推导: pass.dal.exec和eval :  学习到的新函数:(以下函数的应用代码均在IDLE测试通过) ch ...

  5. Python连载25-函数tell&write&writeline$&持久化

    一. 1.连续打印举例 #打开文件,三个字符一组读出来内容,然后显示在屏幕上,每读一次,停一秒 import time with open(r"test01.txt",'r') a ...

  6. MyEclipse2014破解版

    百度云:链接:http://pan.baidu.com/s/1c3jKMa 密码:yss0 等版本)后,不要打开软件. 二.解压破解文件压缩包,得到一下文件列表: 三.双击run.bat,即可运行cr ...

  7. 实现简单的 IOC 和 AOP

    1 简单的 IOC 1.1 简单的 IOC 容器实现的步骤 加载 xml 配置文件,遍历其中的标签 获取标签中的 id 和 class 属性,加载 class 属性对应的类,并创建 bean 遍历标签 ...

  8. 分享一个 Linux 环境下,强力的Python 小工具

    场景 Linux 用户,经常需要在终端查看一些数据,从文件里看 或者网络协议获取数据并查看. 比如,查看文件里的json数据:比如,查看etcd里存下的数据. 如果直接看cat 或者 curl 得到的 ...

  9. 关于Spring的JDBC连接mysql(与传统jdbc比较)

    Spring的jdbc与Hibernate,Mybatis相比较,功能不是特别强大,但是在小型项目中,也到还是比较灵活简单. 首先可以看看一下传统的jdbc是如何操作的呢 传统JDBC 首先呢先要创建 ...

  10. 牛客第十场Rikka with Prefix Sum

    由于其中的2操作非常多,我们就需要将其快速的更改,就会用到组合数的东西 其实自己手写一下就可以发现对于一个点增加的值在经过不断地前缀和累加过程中对于一点的贡献满足杨辉三角 所以我们就需要记录一下其中的 ...