单例模式

介绍

  • 模式:创建型
  • 意图:保证一个类只有一个实例,并提供一个访问它的全局访问点
  • 解决:一个全局使用的类频繁地创建与销毁
  • 场景:
    • 唯一序列号
    • web中的计数器
    • I/O与数据库的连接
    • ……  

实现方式

  • 饿汉式 :静态加载,线程安全

  1. /**
  2. * 单例模式:饿汉式
  3. * 是否Lazy初始化:否
  4. * 是否多线程安全:是
  5. */
  6. public class Singleton {
  7.  
  8. private static Singleton singleton = new Singleton();
  9.  
  10. // 构造器私有
  11. private Singleton() {
  12. }
  13.  
  14. // 实例方法
  15. public static Singleton getInstance() {
  16. return singleton;
  17. }
  18. }

Singleton.java

  • 懒汉式:单校验,线程不安全

  1. /**
  2. * 单例模式:懒汉式
  3. * 是否Lazy初始化:是
  4. * 是否多线程安全:否
  5. */
  6. public class Singleton {
  7.  
  8. private static Singleton singleton;
  9.  
  10. // 构造器私有
  11. private Singleton() {
  12.  
  13. }
  14.  
  15. // 实例方法
  16. public static Singleton getInstance() {
  17. if (singleton == null) {
  18. return new Singleton();
  19. }
  20. return singleton;
  21. }
  22. }

Sington.java

  • 懒汉式:实例方法同步锁,线程安全

  1. /**
  2. * 单例模式:懒汉式
  3. * 是否Lazy初始化:是
  4. * 是否多线程安全:是
  5. */
  6. public class Singleton {
  7.  
  8. private static Singleton singleton;
  9.  
  10. // 构造器私有
  11. private Singleton() {
  12.  
  13. }
  14.  
  15. // 实例方法
  16. public static synchronized Singleton getInstance() {
  17. if (singleton == null) {
  18. return new Singleton();
  19. }
  20. return singleton;
  21. }
  22. }

Sington.java

  • 懒汉式:双检锁/双重校验锁(DCL,double-checked locking),线程安全

  1. /**
  2. * 单例模式:懒汉式
  3. * 是否Lazy初始化:是
  4. * 是否多线程安全:是
  5. */
  6. public class Singleton {
  7.  
  8. private static volatile Singleton singleton;
  9.  
  10. // 构造器私有
  11. private Singleton() {
  12.  
  13. }
  14.  
  15. // 实例方法
  16. public static Singleton getInstance() {
  17. if (singleton == null) {
  18. synchronized (Singleton.class) {
  19. if (singleton == null) {
  20. return new Singleton();
  21. }
  22. }
  23. }
  24. return singleton;
  25. }
  26. }

Sington.java

  • 登记式/静态内部类:线程安全

  1. /**
  2. * 单例模式:登记式/静态内部类
  3. * 是否Lazy初始化:是
  4. * 是否多线程安全:是
  5. */
  6. public class Singleton {
  7.  
  8. // 静态内部类持有
  9. private static class SingletonHolder {
  10. private static final Singleton SINGLETON = new Singleton();
  11. }
  12.  
  13. // 构造器私有
  14. private Singleton() {
  15.  
  16. }
  17.  
  18. // 实例方法
  19. public static Singleton getInstance() {
  20. return SingletonHolder.SINGLETON;
  21. }
  22. }

Sington.java

  • 枚举:线程安全

  1. /**
  2. * 单例模式:枚举
  3. * 是否Lazy初始化:否
  4. * 是否多线程安全:是
  5. */
  6. public enum Singleton {
  7. SINGLETON
  8. }

Singleton.java


资料来源:阿里云大学 - 设计模式

设计模式 - 单例模式(Singleton Pattern)的更多相关文章

  1. 浅谈设计模式--单例模式(Singleton Pattern)

    题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...

  2. 设计模式之单例模式(Singleton Pattern)

    单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...

  3. 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)

    原文:乐在其中设计模式(C#) - 单例模式(Singleton Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 单例模式(Singleton Pattern) 作者:weba ...

  4. 设计模式系列之单例模式(Singleton Pattern)——确保对象的唯一性

    模式概述 模式定义 模式结构图 饿汉式单例与懒汉式单例 饿汉式单例 懒汉式单例 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 适用场景 说明:设计模式系列文章是读刘伟所著 ...

  5. 【设计模式】单例模式 Singleton Pattern

    通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例(Instance)  的情况, 比如说我们想做一计数器,统计某些接口调用的次数,通常我们的数据库连接也是只期望有一个实例.Windo ...

  6. 二十四种设计模式:单例模式(Singleton Pattern)

    单例模式(Singleton Pattern) 介绍保证一个类仅有一个实例,并提供一个访问它的全局访问点. 示例保证一个类仅有一个实例. Singleton using System; using S ...

  7. 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)

    在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...

  8. 十次艳遇单例设计模式(Singleton Pattern)

    1.引言 单例设计模式(Singleton Pattern)是最简单且常见的设计模式之一,在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访 ...

  9. 设计模式 单例模式(Singleton) [ 转载2 ]

    设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...

  10. 设计模式 单例模式(Singleton) [ 转载 ]

    设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创 ...

随机推荐

  1. 『片段』ShellHelper 控制台程序 的 程序调用(支持输入命令得到返回字符串输出)

    背景: > 之前做 OGG 时,被 OGG的配置 恶心到了.(OGG是啥,这里就不解释了) > 总之就是一个 控制台程序,总是得手动执行一堆命令,每次都得输入 —— 实在是打字打累了. & ...

  2. WebGL three.js学习笔记 创建three.js代码的基本框架

    WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...

  3. LDA && NCA: 降维与度量学习

    已迁移到我新博客,阅读体验更佳LDA && NCA: 降维与度量学习 代码实现放在我的github上:click me 一.Linear Discriminant Analysis(L ...

  4. Netty源码—七、内存释放

    Netty本身在内存分配上支持堆内存和直接内存,我们一般选用直接内存,这也是默认的配置.所以要理解Netty内存的释放我们得先看下直接内存的释放. Java直接内存释放 我们先来看下直接内存是怎么使用 ...

  5. 实现AutoMapper(1.0版本)

    最近有个需求就是实体之间自动转换,网上肯定有很多现成的实现,不过还是自己写了一个,就当对java高级特性的一个熟悉的过程.这中间包含了泛型,反射,lamada表达式.对于想了解java高级特性的人来说 ...

  6. C# 跳转新的标签页

    ///这个是拿别人的,找到好多这个方法,溜了,不知道谁是原创 protected void btnPrint_Click(object sender, EventArgs e)        {    ...

  7. 微服务容错限流Hystrix入门

    为什么需要容错限流 复杂分布式系统通常有很多依赖,如果一个应用不能对来自依赖 故障进行隔离,那么应用本身就处在被拖垮的风险中.在一个高流量的网站中,某个单一后端一旦发生延迟,将会在数秒内导致 所有应用 ...

  8. 海思Hi3559A/CV100 DDR4驱动配置手册

    Hi3559AV100 DDR4 驱动配置说明 1.1 Hi3559AV100 DDR4 CLK/AC 驱动配置方法 寄存器地址 DDR PHY0:0x1206d0bc DDR PHY1:0x1206 ...

  9. softmax函数详解

    答案来自专栏:机器学习算法与自然语言处理 详解softmax函数以及相关求导过程 这几天学习了一下softmax激活函数,以及它的梯度求导过程,整理一下便于分享和交流. softmax函数 softm ...

  10. Java核心技术第五章——1.类、超类、子类(1)

    1.定义子类: 关键字extends表明正在构造的新类派生与一个已存在的类.已存在的类称为超类.基类或父类:新类称为子类.派生类或孩子类.超类和子类是Java程序员最常用的两个术语(emmm~~我觉得 ...