概念

单例模式即一个JVM内存中只存在一个类的对象实例

分类

1、懒汉式

类加载的时候就创建实例

2、饿汉式

使用的时候才创建实例

当然还有其他的生成单例的方式,双重校验锁,枚举和静态内部类,文中会有介绍

实践

懒汉式

1)线程不安全,不可用

public class Singleton {  private static Singleton instance;  private Singleton (){}  public static Singleton getInstance() {  if (instance == null) {  instance = new Singleton();  }  return instance;  }  } 

2)线程安全,同步方法,效率低,不推荐

public class Singleton {  private static Singleton instance;  private Singleton (){}  public static synchronized Singleton getInstance() {  if (instance == null) {  instance = new Singleton();  }  return instance;  }  } 

3)线程不安全,会产生多个实例,不可用

public class Singleton {private static Singleton singleton;private Singleton() {}public static Singleton getInstance() {if (singleton == null) {synchronized (Singleton.class) {singleton = new Singleton();}}return singleton;}
}

4) 饿汉式,无线程安全问题,不能延迟加载,影响系统性能

public class Singleton {  private static Singleton instance = new Singleton();  private Singleton (){}  public static Singleton getInstance() {  return instance;  }  } 

5)

public class Singleton {  private static Singleton instance = null;  static {  instance = new Singleton();  }  private Singleton (){}  public static Singleton getInstance() {  return instance;  }  }

6)双重校验锁,线程安全,推荐使用

public class Singleton {private static volatile Singleton singleton;private Singleton() {}public static Singleton getInstance() {if (singleton == null) {synchronized (Singleton.class) {if (singleton == null) {singleton = new Singleton();}}}return singleton;}} 

7)静态内部类,线程安全,主动调用时才实例化,延迟加载效率高,推荐使用

public class Singleton {  private static class SingletonHolder {  private static final Singleton INSTANCE = new Singleton();  }  private Singleton (){}  public static final Singleton getInstance() {  return SingletonHolder.INSTANCE;  }  } 

8)枚举类型,无线程安全问题,避免反序列华创建新的实例,很少使用

public enum Singleton {  INSTANCE;  public void whateverMethod() {  }  }

注意事项

1、考虑多线程问题

2、单例类构造方法要设置为private类型禁止外界new创建

private Singleton() {}

3、如果类可序列化,考虑反序列化生成多个实例问题,解决方案如下

private Object readResolve() throws ObjectStreamException {  // instead of the object we're on, return the class variable INSTANCE  return INSTANCE;  }  

使用场景

1、工具类对象

2、系统中只能存在一个实例的类

3、创建频繁或又耗时耗资源且又经常用到的对象

下面是单例模式在JDK的应用

另外,spring容器中的实例默认是单例饿汉式类型的,即容器启动时就实例化bean到容器中,当然也可以设置懒汉式defalut-lazy-init="true"为延迟实例化,用到时再实例化。

设计模式之单例模式实践相关推荐

  1. 实践GoF的设计模式:单例模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:单例模式>,作者: 元闰子. 简述 GoF 对单例模式(Singleton)的定义如下: Ensure a class onl ...

  2. JavaScript设计模式与开发实践系列之单例模式

    本系列为<JavaScript设计模式与开发实践>(作者:曾探)学习总结,如想深入了解,请支持作者原版 单例模式 实现单例模式 单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的 ...

  3. JavaScript设计模式与开发实践 - 单例模式

    引言 本文摘自<JavaScript设计模式与开发实践> 在传统开发工程师眼里,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返 ...

  4. 《JavaScript设计模式与开发实践》阅读摘要

    <JavaScript设计模式与开发实践>作者:曾探 系统的介绍了各种模式,以及js中的实现.应用,以及超大量高质量代码,绝对值得一读 面向对象的js 静态类型:编译时便已确定变量的类型 ...

  5. 专访《Javascript设计模式与开发实践》作者曾探:爱编程 爱生活

     专访<Javascript设计模式与开发实践>作者曾探:爱编程 爱生活 发表于12小时前| 2742次阅读| 来源CSDN| 8 条评论| 作者夏梦竹 专访曾探图书作者Javascr ...

  6. javascript 设计模式之单例模式

    单例模式是一种简单而非常实用的模式特别是惰性单例技术,下面例子贴出了单列模式的代码 <button id="loginBtn">登录</button>< ...

  7. java connection 单例_Java设计模式之单例模式详解

    Java设计模式之单例模式详解 什么是设计模式 设计模式是在大量的实践中总结和理论之后优选的代码结构,编程风格,以及解决问题的思考方式.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可 ...

  8. Javascript设计模式之单例模式

    前言:菜鸡也有梦想,而我的梦想就是进一个真正的互联网大厂.以前学习的时候没有系统的整理,从今天开始要保持每周写博客的习惯,希望自己可以有所成长.为了培养编程思维,决定从设计模式开始写起.我是通过读&l ...

  9. javascript设计模式(javascript设计模式与开发实践读书笔记)

    javascript设计模式(javascript设计模式与开发实践读书笔记) 单例模式 策略模式 代理模式 迭代器模式 发布-订阅模式 命令模式 组合模式 模板方法模式 享元模式 职责链模式 中介者 ...

最新文章

  1. 2021年用于图像处理的Python顶级库
  2. 利用CodeIgniter中的Email类发邮件
  3. 前端一HTML:十三:css的三大特性
  4. python 技术篇-使用logging日志模块自定义时间格式
  5. 页面滚动到指定class样式位置
  6. 计算机基础知识:什么是位、字节、字、KB、MB
  7. 聚水潭是如何基于AnalyticDB for PostgreSQL 构筑海量实时数仓平台的
  8. js方法写在html中,在js中写html代码怎么写
  9. 多表利用DIH批量导入数据并建立索引注意事项
  10. java停止循环label_Java中的break Label 和continue Label 例子(跳出多重循环)(转)...
  11. win10 flashcs6不能用了_听说这版win10马上不能用了?那就改装“它”,比win7还稳定流畅...
  12. Sql Server 的sa用户被禁用
  13. 今日你以老师为荣,明日老师以你为荣!
  14. 身份证前6位编码与地址对应关系表
  15. 结构体定义的几种方式
  16. 搜索自己博客中的文章
  17. linux 打开关闭CPU超线程和查看逻辑CPU的个数
  18. 大家好,我是练习时长两年半的LeetCode爱好者,喜欢唱跳rap
  19. html5仿ios底部菜单栏,仿苹果电脑任务栏菜单
  20. Android 屏蔽Menu键

热门文章

  1. Fast Walsh-Hadamard Transform——快速沃尔什变换
  2. MariaDB Spider:实现MySQL横纵向扩展的小能手
  3. 一枚菜狗子的2016总结
  4. 【oracle】TNS-03505: 无法解析名称
  5. [LintCode] Fast Power
  6. 面试题27.二叉搜索树与双向链表
  7. Hadoop LZO的安装与配置
  8. 我看Chrome超越IE的意义
  9. kafka的groupid
  10. 【机器学习入门笔记5:OpenCV像素的基础知识】20190203