定义

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。

特点

1、单例类只能有一个实例。
  2、单例类必须自己自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例

单例模式的要点:

1,私有的构造方法

2,指向自己实例的私有静态引用

3,以自己实例为返回值的静态的公有的方法

单例模式根据实例化对象时机的不同分为两种:

一种是饿汉式单例,一种是懒汉式单例。

饿汉式单例在单例类被加载时候,就实例化一个对象交给自己的引用;而懒汉式在调用取得实例方法的时候才会实例化对象。

代码如下:

饿汉式单例

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

懒汉式单例

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

单例模式还有一种比较常见的形式:双重锁的形式

public class Singleton{    private static volatile Singleton instance=null;
    private Singleton(){        //do something}    public static  Singleton getInstance(){
        if(instance==null){
            synchronized(SingletonClass.class){                if(instance==null){instance=new Singleton();}}}        return instance;}
}
    这个模式将同步内容下方到if内部,提高了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建了以后就没必要了。
        这种模式中双重判断加同步的方式,比第一个例子中的效率大大提升,因为如果单层if判断,在服务器允许的情况下,假设有一百个线程,耗费的时间为100*(同步判断时间+if判断时间),而如果双重if判断,100的线程可以同时if判断,理论消耗的时间只有一个if判断的时间。

所以如果面对高并发的情况,而且采用的是懒汉模式,最好的选择就是双重判断加同步的方式。


单例模式的优点:

1,在内存中只有一个对象,节省内存空间。

2,避免频繁的创建销毁对象,可以提高性能。

3,避免对共享资源的多重占用。

4,可以全局访问。

单例模式的优点:

1,扩展困难,由于getInstance静态函数没有办法生成子类的实例。如果要拓展,只有重写那个类。

2,隐式使用引起类结构不清晰。

3,导致程序内存泄露的问题。

适用场景:

由于单例模式的以上优点,所以是编程中用的比较多的一种设计模式。以下为使用单例模式的场景:

1,需要频繁实例化然后销毁的对象。

2,创建对象时耗时过多或者耗资源过多,但又经常用到的对象。

3,资源共享的情况下,避免由于资源操作时导致的性能或损耗等

4,控制资源的情况下,方便资源之间的互相通信。

单例模式注意事项:

只能使用单例类提供的方法得到单例对象,不要使用反射,否则将会实例化一个新对象。

不要做断开单例类对象与类中静态引用的危险操作。

多线程使用单例使用共享资源时,注意线程安全问题。

关于Java中单例模式的一些常见问题:


单例模式的对象长时间不用会被jvm垃圾收集器收集吗

除非人为地断开单例中静态引用到单例对象的联接,否则jvm垃圾收集器是不会回收单例对象的。

jvm卸载类的判定条件如下:

1,该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。

2,加载该类的ClassLoader已经被回收。

3,该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。

只有三个条件都满足,jvm才会在垃圾收集的时候卸载类。显然,单例的类不满足条件一,因此单例类也不会被回收。

在一个jvm中会出现多个单例吗

在分布式系统、多个类加载器、以及序列化的的情况下,会产生多个单例,这一点是无庸置疑的。那么在同一个jvm中,会不会产生单例呢?使用单例提供的getInstance()方法只能得到同一个单例,除非是使用反射方式,将会得到新的单例。

代码如下:

Class c = Class.forName(Singleton.class.getName());
Constructor ct = c.getDeclaredConstructor();
ct.setAccessible(true);
Singleton singleton = (Singleton)ct.newInstance();

这样,每次运行都会产生新的单例对象。所以运用单例模式时,一定注意不要使用反射产生新的单例对象。

在getInstance()方法上同步有优势还是仅同步必要的块更优优势?

因为锁定仅仅在创建实例时才有意义,然后其他时候实例仅仅是只读访问的,因此只同步必要的块的性能更优,并且是更好的选择。

缺点:只有在第一次调用的时候,才会出现生成2个对象,才必须要求同步。而一旦singleton 不为null,系统依旧花费同步锁开销,有点得不偿失。

单例类可以被继承吗

根据单例实例构造的时机和方式不同,单例模式还可以分成几种。但对于这种通过私有化构造函数,静态方法提供实例的单例类而言,是不支持继承的。

这种模式的单例实现要求每个具体的单例类自身来维护单例实例和限制多个实例的生成。但可以采用另外一种实现单例的思路:登记式单例,来使得单例对继承开放。

23种设计模式(1)-单例模式相关推荐

  1. java 23种设计模式 04 单例模式

    java 23种设计模式 04 单例模式 一.什么是单例模式 单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象.也就是说,在整个程序空间中,该类只存在一个实例对象.   ...

  2. 23种设计模式之单例模式、工厂模式、原型模式、建造者模式

    系列文章目录 第一章:程序设计原则-单一职责.接口隔离.依赖倒置.里式替换 第二章:程序设计原则-开闭原则.迪米特法则.合成复用原则 文章目录 系列文章目录 一.设计模式简单介绍 1.1.什么是设计模 ...

  3. Java面试23种设计模式之单例模式的8种实现方式

    单例模式8中实现方式 1.单例模式介绍 2.单例模式的八种方式 3.饿汉式(静态常量),这种单例模式可用,可能造成内存浪费. 4.饿汉式(静态代码块),这种单例模式可用,可能造成内存浪费. 5.懒汉式 ...

  4. 《23种设计模式之单例模式(4种实现)》

    说在前头:本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,能力有限,文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正.若 ...

  5. 23种设计模式之单例模式

    单例模式 单例模式(Singleton Pattern)是一个比较简单的模式,其定义为:Ensure a class has only one instance,and provide a globa ...

  6. JAVA设计模式总结之23种设计模式

    一.什么是设计模式                                                                                           ...

  7. 23种设计模式之模板方法

    23种设计模式总篇:chenmingyu.top/design/ 模板方法 模板方法属于行为型模式 定义:定义一个操作中的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重定 ...

  8. JAVA设计模式总结之23种设计模式(重点!!!)

    JAVA设计模式总结之23种设计模式: 一.什么是设计模式 设计模式遵循的原则有6个: 二.设计模式的三个分类 三.各分类中模式的关键点 四.概说23种设计模式 1.单例模式(Singleton) 2 ...

  9. java 的23种设计模式 单例模式

    23种设计模式友情链接: 点击打开链接 单例模式: A.饿汉式单例模式 具体步骤: 1.声明一个私有的静态的最终的本类类型的对象并实例化 private static final Person ins ...

  10. 23种设计模式之《单例模式》

    什么是单例模式 单例模式是23种设计模式中最简单和易用的模式.在某些情境下,如在一个上市公司中,有很多不同级别的员工,但是公司的CEO或者CTO都是只有一个的,CEO或者CTO在公司里就要求是一个单例 ...

最新文章

  1. sql中的Tran和C#中的TransactionScope介绍
  2. 收银机多少钱一台推荐科脉系统_防火门监控系统安装预算多少钱?防火门监控系统安装预算表[今日推荐]...
  3. 转:SparkConf 配置的用法
  4. redis 队列_Redis与Rabbitmq消息队列的区别
  5. Session过期,如何跳出iframe框架页的问题
  6. SIMD 编程的优势与SIMD指令:SSE/AVX 与编程demo
  7. gradle生成java文件_使用Gradle for Java插件生成Java类
  8. python猜单词游戏_python 猜单词游戏 代码
  9. 中级软件设计师考试(软考中级)设计模式分类及其典型特点
  10. 心理声学模型在感知音频编码中的应用
  11. android qq 微信绑定,QQ或微信互联快捷登录怎么绑定微信提醒?
  12. win10查看服务器共享文件夹权限设置,win10共享文件夹没有权限访问权限
  13. [日常训练] 联络网
  14. VR虚拟现实AR增强现实编程(1):VR和AR简介
  15. 文献【综述】Hallmarks of Cancer: The Next Generation 肿瘤的新十大特征
  16. 戴口罩人脸识别、高精度人脸识别解决方案
  17. C语言 在程序中打开网页,模拟鼠标点击、键盘输入
  18. 热电阻pt100 CU50隔离转换器转4-20ma模拟量输出温度变送器0-10V
  19. 毫米波点云生成论文 阅读笔记 | 3D Point Cloud Generation with Millimeter-Wave Radar
  20. 51单片机实验软件proteus出现错误集锦

热门文章

  1. 迅游科技上演“宫斗” 董事长总裁互相罢免
  2. 许家印大笔押注新能源:恒大集团1200亿沈阳投资建厂造车
  3. 华为:对学生定制机毫不知情 将会对虚假宣传追责
  4. 麒麟985曝光!华为Mate 30或首发:标配5G 性能大增
  5. 拳王虚拟项目公社:虚拟资源自动化赚钱的原理是什么?真的靠谱吗?会不会骗人?
  6. 【点阵液晶编程连载五】液晶驱动代码的移植
  7. 深入聊聊MVVM框架(闲谈)
  8. 晨哥真有料丨及时止损的信号及可能的挽回方法
  9. 辽宁工业大学有没有计算机专业,辽宁工业大学(专业学位)计算机技术考研难吗...
  10. 初入c++(三)this指针,友元函数,友元类