一、单例模式简介

单例模式是Java设计模式中常见的一种模式。主要分为懒汉式单例、饿汉式单例、登记式单例;

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

二、饿汉式单例

public classSingleTonModel {privateSingleTonModel(){}private static final SingleTonModel singt=newSingleTonModel();public staticSingleTonModel getInstance(){returnsingt;

}

}

饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。

三、懒汉式单例

简单的例子:

public classSingleTonModel {privateSingleTonModel(){}private static SingleTonModel singt=null;public staticSingleTonModel getInstance(){if(singt==null){

singt=newSingleTonModel();

}returnsingt;

}

}

Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。

(事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。此问题在此处不做讨论,姑且掩耳盗铃地认为反射机制不存在。)

但是以上懒汉式单例的实现没有考虑线程安全问题,它是线程不安全的,并发环境下很可能出现多个Singleton实例,要实现线程安全,有以下三种方式,都是对getInstance这个方法改造,保证了懒汉式单例的线程安全:(课外知识可以了解线程安全)

改造一:在静态方法上添加关键词:synchronized,进行同步

public classSingleTonModel {privateSingleTonModel(){}private static SingleTonModel singt=null;public staticsynchronizedSingleTonModel getInstance(){if(singt==null){

singt=newSingleTonModel();

}returnsingt;

}

}

虽然通过同步保障了线程安全,但是每次都要同步,会影响性能,毕竟99%的情况下是不需要同步的。

改造二:在判断不存在实例时才进行同步

public classSingleTonModel {privateSingleTonModel(){}private static SingleTonModel singt=null;public staticSingleTonModel getInstance(){if(singt==null){

synchronized(SingleTonModel.class){if(singt==null){

singt=newSingleTonModel();

}

}

}returnsingt;

}

}

在getInstance中做了两次null检查,确保了只有第一次调用单例的时候才会做同步,这样也是线程安全的,同时避免了每次都同步的性能损耗。

改造三:添加内部静态类

public classSingleTonModel {privateSingleTonModel(){}private static classlanSingleton{private static final SingleTonModel singt=newSingleTonModel();

}public staticfinal SingleTonModel getInstance(){returnlanSingleton.singt;

}

}

利用了classloader的机制来保证初始化instance时只有一个线程,所以也是线程安全的,同时没有性能损耗,所以一般我倾向于使用这一种。

四、登记式单例(很少用)

/类似Spring里面的方法,将类名注册,下次从里面直接获取。public classSingleton3 {private static Map map = new HashMap();static{

Singleton3 single= newSingleton3();

map.put(single.getClass().getName(), single);

}//保护的默认构造子

protectedSingleton3(){}//静态工厂方法,返还此类惟一的实例

public staticSingleton3 getInstance(String name) {if(name == null) {

name= Singleton3.class.getName();

System.out.println("name == null"+"--->name="+name);

}if(map.get(name) == null) {try{

map.put(name, (Singleton3) Class.forName(name).newInstance());

}catch(InstantiationException e) {

e.printStackTrace();

}catch(IllegalAccessException e) {

e.printStackTrace();

}catch(ClassNotFoundException e) {

e.printStackTrace();

}

}return map.get(name);

}//一个示意性的商业方法

publicString about() {return "Hello, I am RegSingleton.";

}public static voidmain(String[] args) {

Singleton3 single3= Singleton3.getInstance(null);

System.out.println(single3.about());

}

}

登记式单例实际上维护了一组单例类的实例,将这些实例存放在一个Map(登记薄)中,对于已经登记过的实例,则从Map直接返回,对于没有登记的,则先登记,然后返回。

课外小知识:

1、什么是线程安全

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

或者说:一个类或者程序所提供的接口对于线程来说是原子操作,或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题,那就是线程安全的。

java23种设计模式+单例_Java23种设计模式之单例模式相关推荐

  1. 23种设计模式 单例 (整理摘抄优秀的博文) 记住

    https://github.com/yzmaodeng/java-keypointknowledge/commit/0894a14b03b724cd362f466e8f20514efbc164aa ...

  2. Objective-C设计模式——单例Singleton(对象创建)

    单例 和其它语言的单例产不多,可以说是最简单的一种设计模式了.但是有几个点需要注意下,单例就是一个类只有一个实例. 所以我们要想办法阻止该类产生别的实例,一般语言中都会将构造函数写为private.但 ...

  3. java设计模式 单例_java设计模式--单例模式

    单例设计模式 Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点. 核心知识点如下: (1) 将采用单例 ...

  4. java test20006_Java单例7种测试实践

    单例:一个进程中只能存在唯一一个对象. 1.饿汉模式. 主动型太粗暴./** * @author :jiaolian * @date :Created in 2021-01-10 21:25 * @d ...

  5. 面试官最喜欢考的设计模式---单例设计模式

    一.讲在前面的废话 笔者曾经多次面试都遇到了这个问题,请你说一下软件的设计模式,一般我们都会把23种模式例举几个出来,如果没有说错,你一定会列举单例设计模式,这样的话你就中了面试官的圈套了.接下来的一 ...

  6. Java设计模式——单例设计模式/权限修饰符的使用

    1. 单例模式含义 所谓的单例设计模式,就是采取一定的方法保证整个软件系统中,某个类只能存在一个对象实例. 单例设计模式 2. 单例设计模式的两种实现方法 饿汉式:不管是否需要该实例,我事先就把该实例 ...

  7. JAVA设计模式 - 单例与工厂模式

    前言 设计模式是在前人总结下 , 得出的经验, 设计模式的本质是面向对象设计原则的实际运用,是对类的封装性.继承性和多态性以及类的关联关系和组合关系的充分理解, 接着我们来看设计模式中的两种比较重要的 ...

  8. Java设计模式—单例设计模式(Singleton Pattern)完全解析

    转载请注明出处:http://blog.csdn.net/dmk877/article/details/50311791 相信大家都知道设计模式,听的最多的也应该是单例设计模式,这种模式也是在开发中用 ...

  9. Java设计模式-单例设计模式

    文章目录 前言 一.什么是设计模式? 二.单例模式介绍 1.单例模式的目的 2.单例模式的定义 单例模式的设计与实现要点: 3.单例模式的两种实现方式 (一)饿汉式创建 (二)懒汉式创建 4.单例模式 ...

最新文章

  1. CUDA Samples: dot product(使用零拷贝内存)
  2. idea androidx控件不显示预览_如何解决SOLIDWORKS不显示缩略图预览的方法?
  3. Selenium常用方法及函数
  4. 【Linux】一步一步学Linux——groupdel命令(88)
  5. error和exception
  6. C# 8.0 的默认接口方法
  7. ElasticSearch入门教程-索引
  8. swift3 按钮触发事件_swift5.3 UIView 与 UIButton 点击事件传递参数
  9. sql out apply_在SQL Server中CROSS APPLY和OUTER APPLY之间的区别
  10. Zabbix-1.8.14 安装
  11. 解决select2在bootstrap的modal中默认不显示的问题
  12. Java SE (5)之 线程使用
  13. TSPL学习笔记(2):过程和变量绑定
  14. matlab数缺失值填充,matlab缺失值填补
  15. DHCP动态获取IP地址流程
  16. 【基础知识】9、加州房价预测
  17. Python 对称矩阵顺时针旋转90度
  18. 跨平台Office文档预览原生插件,非腾讯X5,支持离线,稳定高可用
  19. 【ZCMU1931】wjw的剪纸(dfs)
  20. VGA接口和HDMI接口有什么区别 哪个好

热门文章

  1. CTF Autokey加密
  2. python教程:getattr函数和hasattr函数的用法
  3. Python必学内容:格式化输出的三种方式
  4. python 函数教程:必选参数与默认参数
  5. 用python做一些excel的事情,实现数据自动化
  6. android另开进程,android在一个app程序中,打开另一个app的方法
  7. php 通知客户端,PHP+SSE服务器向客户端推送消息
  8. androidsdktools安装_如何命令行安装Android SDK Build Tools(构建工具)?
  9. java web html入门书籍,JavaWeb入门到学废的第一天(HTML学习)
  10. python 将PascalVOC(XML)格式的标注数据批量转换为YOLO(txt)格式的标注数据