单例模式通常分懒汉和饿汉两种模式。

1、懒汉单例模式

可以理解为懒汉模式创建的类,非常懒,只有在被调用时才会判断自身是否已有对象,如果没有就立即创建自身对象,然后返回。如果已有对象就立即返回。

public Class Single{private static Single intance = null;private Single(){};//私有默认构造器public static synchronized Single getIntence(){//添加同步锁,防止多线程同时进入造成多次实例化if(intence==null){intance = new Single();}return intance;}
}

优点:调用时才会初始化,避免资源浪费。

缺点:加了synchronized锁,影响效率 。

2、饿汉单例模式

可以理解为饿汉模式创建的类都很饥渴,在类加载的时候就创建对象。

public Class Single{private static Single intance = new Single();//当类加载时就调用自身private Single(){};public static Single getIntance(){return intance;}
}

优点:1、线程安全,在类加载时创建实例不存在在运行过程中,多个线程创建多次实例,避免了多线程同步的情况。

2、调用时速度快。

缺点:资源效率不高,如果之后没有用到getinstance()的话,会造成资源浪费。

下面介绍几种单例模式为常用细分类:

1、懒汉模式不安全(lazy loading)

严格意义上不是单例模式,这种模式不能在多线程环境下使用。

public Class Single{private static Single instance;private Single();public static Single getInstance(){  //未加安全锁,大家一起用if(instance == null){instance = new Single();}return instance;}
}

很明显这种方式不适合在多线程下使用。

下面这几种都适合多线程使用。

2、双重检验锁/双检锁

他是懒汉的一种,这种方式采用了双锁机制,在安全下保持高性能。

public Class Single{private static Single instance;private Single();public static Single getInstance(){if(instance == null){synchronized(Single.class);if(instance == null){instance = new Single();}}}}

可在实例域需要延迟初始化的时候使用。

3、登记式/静态内部类

对静态域进行延迟初始化应用这种方式而不用双检锁。

public Class Single{private static class SingleHandler{private static final Single instance = new Single();}private Single(){};public static final Single getInstance(){return SingleHandler().instance;}
}

这种方式就是Single类被加载后,instance不一定被实例化。如果实例化 instance 很消耗资源,所以想让它延迟加载,另外一方面,又不希望在 Singleton 类加载时就实例化,因为不能确保 Singleton 类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化 instance 显然是不合适的。

4、枚举

这种方式是 Effective Java 作者 Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还自动支持序列化机制,防止反序列化重新创建新的对象,绝对防止多次实例化。他不具有懒汉的特性。由于 JDK1.5 之后才加入 enum 特性,在实际工作中,很少用。

不能通过 reflection attack 来调用私有构造方法。

public enum Single(){instance;public void method(){}
}

总结

通常,不建议使用懒汉模式不安全和synchronizad懒汉方式,建议使用饿汉方式。只有在要明确实现 lazy loading 效果时,才会使用登记式。如果涉及到反序列化创建对象时,可以尝试使用枚举方式。如果有其他特殊的需求,可以考虑使用双检锁方式。

设计模式----单例模式实例相关推荐

  1. Python设计模式-单例模式

    Python设计模式-单例模式 基于Python3.5.2,代码如下 #coding:utf-8 import threading import timeclass Singleton(object) ...

  2. Android设计模式——单例模式(Singleton)

    二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元 ...

  3. 【学习笔记】ABAP OOD设计模式 - 单例模式

    ABAP OOD设计模式 - 单例模式 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 单例模式(Singleton Pattern)是常用的且较为简单的软件设计模式 ...

  4. Go 语言实现 23 种设计模式 单例模式

    Go 语言实现 23 种设计模式 单例模式 单例模式 单例模式是一种常用的软件设计模式,在使用过程中,单例对象的类只有一个实例.使用单例模式,1 可以节省内存等资源,例如windows操作系统的资源管 ...

  5. java singleton inner class_Java面向对象设计模式-单例模式

    Java面向对象设计模式-单例模式 2020-05-28 589 0 单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点,有多重实现方式. 一.饿汉式单例模式,构造方法私有化,在加载类Sin ...

  6. Java开发中常用的设计模式-单例模式

    单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式. Java开发中常用的设计模式-单例模式 单例模式有3个特点: 单例类只有一个实例对象: 该单例对象必须 ...

  7. 炒冷饭系列:设计模式 单例模式

    2019独角兽企业重金招聘Python工程师标准>>> 炒冷饭系列:设计模式 单例模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆 ...

  8. 设计模式-单例模式-注册式单例模式-枚举式单例模式和容器式单例模式在Java中的使用示例

    场景 设计模式-单例模式-饿汉式单例模式.懒汉式单例模式.静态内部类在Java中的使用示例: 设计模式-单例模式-饿汉式单例模式.懒汉式单例模式.静态内部类在Java中的使用示例_霸道流氓气质的博客- ...

  9. 设计模式----创建型设计模式(单例模式、工厂方法模式、构建者模式)

    创建型设计模式 单例模式(Singleton Pattern) 单例模式介绍 代码演示 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全, ...

最新文章

  1. 哪个版本好_《道德经》道尽人生大智慧,哪个版本《道德经》的注释比较好呢?...
  2. python 购物车代码
  3. Docker入门-搭建docker私有仓库
  4. SpringBoot高级-检索-Elasticsearch简介安装
  5. springboot定时备份MYSQL_spring boot 定时备份数据库
  6. 利用CSS3实现鼠标悬停在图片上图片缓慢缩放的两种方法
  7. linux monitor工具,5 款 Ubuntu 系统监控工具
  8. 卧槽!全网最全编程学习网站汇总!还不赶快放到收藏夹里吃灰~
  9. 什么是人工智能?人工智能如何系统的学习
  10. matlab飞机大战小游戏(第二版)
  11. 边云协同的优点_探析云边协同的九大应用场景
  12. 【Java】使用PDF模板合成PDF文件(文本 + 图片)
  13. 图说三极管,太容易懂了!(史上最详细版本)
  14. 大数据_07 【hadoop HDFS的shell命令操作】
  15. 数据库系统概论(第十章: 数据库恢复技术)
  16. Linux——软件安装
  17. 第三方推送(小米华为友盟)接入实践
  18. A Blockchain-based Decentralized Federated Learning Framework wth Committee Consensus
  19. 【转】学习如何学习的算法:简述元学习研究方向现状
  20. 设计模式七:结构型-适配器模式

热门文章

  1. 【放置奇兵】算法 PVE总结
  2. 单目标识别下的以中心点定位为目标值的yolo改进算法措施
  3. python numpy np.argsort()(返回将对数组进行排序的索引)(不懂区别?)
  4. 哈尔滨工业大学-数据库系统(基本知识与关系模型1)
  5. excel行列互换_Excel如何实现行列数据互换?其实除了复制粘贴,还能这样操作...
  6. 个人所有博客分类总结(持续更新)
  7. Java获取近七天的数据条数,及页面实现折线图(附前后端代码)
  8. JdbcTemplate中的query方法(代码)
  9. 动态添加 ajax,ajax动态的添加内容【原创】
  10. 组播应用场景_推介4K IP切换系统在5G媒体集成制作中的应用