java23种设计模式+单例_Java23种设计模式之单例模式
一、单例模式简介
单例模式是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种设计模式之单例模式相关推荐
- 23种设计模式 单例 (整理摘抄优秀的博文) 记住
https://github.com/yzmaodeng/java-keypointknowledge/commit/0894a14b03b724cd362f466e8f20514efbc164aa ...
- Objective-C设计模式——单例Singleton(对象创建)
单例 和其它语言的单例产不多,可以说是最简单的一种设计模式了.但是有几个点需要注意下,单例就是一个类只有一个实例. 所以我们要想办法阻止该类产生别的实例,一般语言中都会将构造函数写为private.但 ...
- java设计模式 单例_java设计模式--单例模式
单例设计模式 Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点. 核心知识点如下: (1) 将采用单例 ...
- java test20006_Java单例7种测试实践
单例:一个进程中只能存在唯一一个对象. 1.饿汉模式. 主动型太粗暴./** * @author :jiaolian * @date :Created in 2021-01-10 21:25 * @d ...
- 面试官最喜欢考的设计模式---单例设计模式
一.讲在前面的废话 笔者曾经多次面试都遇到了这个问题,请你说一下软件的设计模式,一般我们都会把23种模式例举几个出来,如果没有说错,你一定会列举单例设计模式,这样的话你就中了面试官的圈套了.接下来的一 ...
- Java设计模式——单例设计模式/权限修饰符的使用
1. 单例模式含义 所谓的单例设计模式,就是采取一定的方法保证整个软件系统中,某个类只能存在一个对象实例. 单例设计模式 2. 单例设计模式的两种实现方法 饿汉式:不管是否需要该实例,我事先就把该实例 ...
- JAVA设计模式 - 单例与工厂模式
前言 设计模式是在前人总结下 , 得出的经验, 设计模式的本质是面向对象设计原则的实际运用,是对类的封装性.继承性和多态性以及类的关联关系和组合关系的充分理解, 接着我们来看设计模式中的两种比较重要的 ...
- Java设计模式—单例设计模式(Singleton Pattern)完全解析
转载请注明出处:http://blog.csdn.net/dmk877/article/details/50311791 相信大家都知道设计模式,听的最多的也应该是单例设计模式,这种模式也是在开发中用 ...
- Java设计模式-单例设计模式
文章目录 前言 一.什么是设计模式? 二.单例模式介绍 1.单例模式的目的 2.单例模式的定义 单例模式的设计与实现要点: 3.单例模式的两种实现方式 (一)饿汉式创建 (二)懒汉式创建 4.单例模式 ...
最新文章
- CUDA Samples: dot product(使用零拷贝内存)
- idea androidx控件不显示预览_如何解决SOLIDWORKS不显示缩略图预览的方法?
- Selenium常用方法及函数
- 【Linux】一步一步学Linux——groupdel命令(88)
- error和exception
- C# 8.0 的默认接口方法
- ElasticSearch入门教程-索引
- swift3 按钮触发事件_swift5.3 UIView 与 UIButton 点击事件传递参数
- sql out apply_在SQL Server中CROSS APPLY和OUTER APPLY之间的区别
- Zabbix-1.8.14 安装
- 解决select2在bootstrap的modal中默认不显示的问题
- Java SE (5)之 线程使用
- TSPL学习笔记(2):过程和变量绑定
- matlab数缺失值填充,matlab缺失值填补
- DHCP动态获取IP地址流程
- 【基础知识】9、加州房价预测
- Python 对称矩阵顺时针旋转90度
- 跨平台Office文档预览原生插件,非腾讯X5,支持离线,稳定高可用
- 【ZCMU1931】wjw的剪纸(dfs)
- VGA接口和HDMI接口有什么区别 哪个好
热门文章
- CTF Autokey加密
- python教程:getattr函数和hasattr函数的用法
- Python必学内容:格式化输出的三种方式
- python 函数教程:必选参数与默认参数
- 用python做一些excel的事情,实现数据自动化
- android另开进程,android在一个app程序中,打开另一个app的方法
- php 通知客户端,PHP+SSE服务器向客户端推送消息
- androidsdktools安装_如何命令行安装Android SDK Build Tools(构建工具)?
- java web html入门书籍,JavaWeb入门到学废的第一天(HTML学习)
- python 将PascalVOC(XML)格式的标注数据批量转换为YOLO(txt)格式的标注数据