一、定义

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

二。使用场景

当对象需要消耗的资源过多(如访问Io、数据库等),避免产生多个对象消耗过多的资源,或者某种类型的对象只应该有且只有一个。

三、实现方法

(1)饿汉单例模式

依靠静态对象的初始化实现单例

public class Singleton{private static Singleton mInstance = new Singleton();private Singleton() {}public static synchronized Singleton getInstance(){return mInstance;}
}
复制代码

(2)懒汉单例模式

第一次调用getInstance()后,单例对象就会被实例化。但每次调用getInstance()方法时都需要进行同步,会造成不必要的消耗。
      对于不频繁调用getInstance()的情况下,可以适用。

public class Singleton{private static Singleton mInstance;private Singleton() {}public static synchronized Singleton getInstance(){if( mInstance == null){mInstance = new Singleton();}return mInstance;}
}
复制代码

(3) Double Check Lock(DCL) 实现单例

public class Singleton{private volatile static Singleton mInstance;private Singleton() {}public static Singleton getInstance(){if( mInstance == null){synchronized(Singleton.class){if( mInstance == null){mInstance = new Singleton();}}}return mInstance;}
}
复制代码

进行两次判空,第一次判断主要避免不必要的同步,第二次判断主要为了在同步情况下确认单例仍为空时,进行初始化。

volatile关键字的作用:
      1、防止重排序
      new对象时,会进行三件事件:
            (1)、给Singleton的实例分配内存;
            (2)、调用Singleton()的构造方法,初始化成员变量。
            (3)、将mInstance对象指向分配的内存空间。
而在JVM中(2)和(3)的顺序是无法被保证的,只能通过volalite保证其有序性。

2、保证线程的可见性。

(4) 静态内部类单例模型

依靠静态内部类被使用时才被JVM加载的原理。

public class Singleton{private Singleton{}public static Singleton getInstance(){return SingletonHolder.mInstance;}//静态内部类private static class SingletonHolder{private static final Singleton mInstance = new Singleton();}
}
复制代码

静态内部类和非静态内部类加载时机的区别:

非静态内部类,一定需要外部类实例化后才会被加载。

静态内部类的加载不需要依附外部类,在使用时才加载进。

(5) 使用容器实现单例。

将多种单例类型注入到一个统一的管理类中,使用时根据key获取对应的单例对象。

public class SingletonManager{private static Map<String,Object> objMap = new HashMap<String,Object>();private SingletonManager{}public static void registerService(String key,Object instance){if(!object.containsKey(key)){objMap.put(key,instance);}}public static Object getService(String key){return objMap.get(key);}
}
复制代码

(6) 枚举单例

枚举类型可以定义自己的方法和自己的变量,而且枚举实例的创建是线程安全的,并且任何情况下都是单例。

public enum SingletonEnum{INSTANCE;public void doSomething(){System.out.println("do ");}
}
复制代码

转载于:https://juejin.im/post/5cba8f8a6fb9a068973eda56

设计模式总结 —— 单例设计模式相关推荐

  1. java软件设计模式只单例设计模式

    概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计 ...

  2. 23种设计模式:单例设计模式(饿汉式 VS 懒汉式)

    23种设计模式:单例设计模式(饿汉式 VS 懒汉式) 每博一文案 世事浮沉,有太多的责任需要我们担当,生活中总有些挫折和磨难,让我们觉得快要杠不住了. 但当我们咬牙坚持过那段难熬的时光后,发现并没有想 ...

  3. java单例设计模式懒汉_Java设计模式之单例设计模式(懒汉、饿汉)

    [toc] Java设计模式之单例设计模式(懒汉.饿汉) 相信面试过的初中级Java开发的朋友可能都有遇到过单例设计模式的笔试题吧,如果之前没有背下来或者不理解,可以看看下面这篇文章,应该足够应付笔试 ...

  4. 设计模式之单例设计模式

    1 设计模式(Design pattern) 代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人 ...

  5. 单例设计模式介绍||单例设计模式八种方式——1) 饿汉式(静态常量) 2) 饿汉式(静态代码块) 3) 懒汉式(线程不安全) 4) 懒汉式(线程安全,同步方法)

    单例模式 单例设计模式介绍 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法). 比如Hibernate的 ...

  6. 设计模式之单例设计模式(懒汉式)

    package july.star.thread22; /*** Teacher* 饿汉式:类一加载就加载* 懒汉式:需要时才加载* 面试题:单例模式的思想是什么,请用代码体现.* 开发:饿汉式(不会 ...

  7. 设计模式之单例设计模式(饿汉式)

    //饿汉式:类一加载就创建 //创建单例对象 package july.star.thread22;/*** Student* 创建单例对象* @author MoXingJian* @email 9 ...

  8. 菜鸟之路-浅谈设计模式之单例设计模式

    单例设计模式 定义:确保一个类仅仅有一个实例,并且自行实例化并向整个系统提供这个实例. 单例模式是一种经常使用的软件设计模式.在它的核心结构中仅仅包括一个被称为单例的特殊类. 通过单例模式能够保证系统 ...

  9. JAVA设计模式之单例设计模式

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

  10. 详解:设计模式之-单例设计模式

    分享一波:程序员赚外快-必看的巅峰干货 前言 近期预计1-2周左右会更新设计模式专题文章. 单例设计模式:保证在一个JVM中,只能存在一个实例. 应用场景:Servlet,Spring IOC,线程池 ...

最新文章

  1. 运行js_最新双十一喵币自动领取方法,安卓手机通过js脚本完美运行
  2. 宁波大学计算机专业英语面试的形式,宁波大学信息学院计算机网络2014复试试题(回忆版)...
  3. Python多任务(7.多进程的应用:文件的拷贝器例子)
  4. 阮一峰es6电子书_ES6理解进阶【大前端高薪训练营】
  5. EXCEL中提取某行最后一个有效单元格数据
  6. javescript的内置对象
  7. Junk-Mail Filter_并查集(hdu 2473)
  8. NPOI自定义单元格背景颜色
  9. CCCC-GPLT L2-019. 悄悄关注 团体程序设计天梯赛
  10. 初窥JQuery-Jquery简介
  11. 当synchronized遇上integer
  12. VMware虚拟机端口映射(NAT设置)
  13. %s %*s %*.*s
  14. 冯东阳:吐胆汁分享原创文章写作经验
  15. 股票策略:A股三季度配置偏向成长股
  16. Hyperledger Fabric国密改造
  17. 给新人文案的一些建议
  18. c语言编写十六进制编辑器,什么是十六进制编辑器?
  19. vue+springboot贫困山区儿童衣物捐赠网站系统
  20. DSP一个程序如何实现RAM和Flash两种下载方式,CCS9

热门文章

  1. MySQL的chap服务器_路由器chap的双向配置命令
  2. 打开浏览器不是主页_教你如何锁定电脑浏览器主页防止被篡改
  3. linux shell脚本中 if 条件判断
  4. Java爬虫 手机号段 归属地 处理后输出sql文件
  5. 电脑向linux板卡传文件,ARM 开发板嵌入式linux系统与主机PC通过串口传输文件
  6. 计算机与信息处理基础知识教案,高效的信息处理工具——计算机基础知识教案...
  7. python 类 super_python的类的super()
  8. checkout 撤销修改_git命令(10):git 常用操作,撤销修改(2)
  9. 安卓手机qq怎么看密友值_qq密友值在哪看
  10. docker ubuntu安装python_BAT架构师手把手教你如何使用Docker安装GPU版本caffe2