详解:设计模式之-单例设计模式
分享一波:程序员赚外快-必看的巅峰干货
应用场景:Servlet,Spring IOC,线程池,连接池,Spring AOP
饿汉式:类初始化时,会立即加载该对象,线程天生安全,调用效率高。
懒汉式: 类初始化时,不会初始化该对象,真正需要使用的时候才会创建该对象,具备懒加载功能。
静态内部方式:结合了懒汉式和饿汉式各自的优点,真正需要对象的时候才会加载,加载类是线程安全的。
枚举单例: 使用枚举实现单例模式 优点:实现简单、调用效率高,枚举本身就是单例,由jvm从根本上提供保障。避免通过反射和反序列化的漏洞, 缺点没有延迟加载。
5.双重检测锁方式 (因为JVM本质重排序的原因,可能会初始化多次,不推荐使用)
其中 ,饿汉式和懒汉式使用最为普遍
饿汉式创建单例
/**
饿汉式
/
public class User01 {
/*- 类初始化时,会立即加载该对象,线程天生安全,调用效率高
*/
private static User01 singletonDemo01 = new User01();
private User01() {
System.out.println(“SingletonDemo01初始化”);
}public static User01 getInstance() {
System.out.println(“getInstance”);
return singletonDemo01;
}public static void main(String[] args) {
User01 s1 = User01.getInstance();
User01 s2 = User01.getInstance();
System.out.println(s1 == s2);
}- 类初始化时,会立即加载该对象,线程天生安全,调用效率高
}
懒汉式创建单例
/**
懒汉式
*/
public class User02 {/**
- 类初始化时,不会初始化该对象,真正需要使用的时候才会创建该对象。
*/
private static User02 singletonDemo02;
private User02() {
}
public synchronized static User02 getInstance() {
if (singletonDemo02 == null) {
singletonDemo02 = new User02();
}
return singletonDemo02;
}public static void main(String[] args) {
User02 s1 = User02.getInstance();
User02 s2 = User02.getInstance();
System.out.println(s1 == s2);
}- 类初始化时,不会初始化该对象,真正需要使用的时候才会创建该对象。
}
静态内部类方式创建单例
/**
静态内部类方式
*/
public class SingletonDemo03 {
private SingletonDemo03() {
System.out.println(“初始化…”);
}public static class SingletonClassInstance {
private static final SingletonDemo03 singletonDemo03 = new SingletonDemo03();
}// 方法没有同步
public static SingletonDemo03 getInstance() {
System.out.println(“getInstance”);
return SingletonClassInstance.singletonDemo03;
}public static void main(String[] args) {
SingletonDemo03 s1 = SingletonDemo03.getInstance();
SingletonDemo03 s2 = SingletonDemo03.getInstance();
System.out.println(s1 == s2);
}
}
优势:兼顾了懒汉模式的内存优化(使用时才初始化)以及饿汉模式的安全性(不会被反射入侵)。
劣势:需要两个类去做到这一点,虽然不会创建静态内部类的对象,但是其 Class 对象还是会被创建,而且是属于永久带的对象。
枚举方式创建单例
enum UserEnum {
HTTP_200(200, “请求成功”),HTTP_500(500,“请求失败”);
private Integer code;
private String name;
UserEnum(Integer code, String name) {
this.code = code;
this.name = name;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {this.code = code;
}public String getName() {return name;
}public void setName(String name) {this.name = name;
}
}
public class TestEnum {
public static void main(String[] args) {System.out.println(UserEnum.HTTP_500.getCode());
}
}
public class User {
public static User getInstance() {
return SingletonDemo04.INSTANCE.getInstance();
}
private static enum SingletonDemo04 {INSTANCE;// 枚举元素为单例private User user;private SingletonDemo04() {System.out.println("SingletonDemo04");user = new User();}public User getInstance() {return user;}
}public static void main(String[] args) {
User u1 = User.getInstance();
User u2 = User.getInstance();
System.out.println(u1 == u2);
}
}
分享一波:程序员赚外快-必看的巅峰干货
如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程
请关注微信公众号:HB荷包
一个能让你学习技术和赚钱方法的公众号,持续更新
详解:设计模式之-单例设计模式相关推荐
- java软件设计模式只单例设计模式
概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计 ...
- 23种设计模式:单例设计模式(饿汉式 VS 懒汉式)
23种设计模式:单例设计模式(饿汉式 VS 懒汉式) 每博一文案 世事浮沉,有太多的责任需要我们担当,生活中总有些挫折和磨难,让我们觉得快要杠不住了. 但当我们咬牙坚持过那段难熬的时光后,发现并没有想 ...
- java单例设计模式懒汉_Java设计模式之单例设计模式(懒汉、饿汉)
[toc] Java设计模式之单例设计模式(懒汉.饿汉) 相信面试过的初中级Java开发的朋友可能都有遇到过单例设计模式的笔试题吧,如果之前没有背下来或者不理解,可以看看下面这篇文章,应该足够应付笔试 ...
- 设计模式之单例设计模式
1 设计模式(Design pattern) 代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人 ...
- 单例设计模式介绍||单例设计模式八种方式——1) 饿汉式(静态常量) 2) 饿汉式(静态代码块) 3) 懒汉式(线程不安全) 4) 懒汉式(线程安全,同步方法)
单例模式 单例设计模式介绍 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法). 比如Hibernate的 ...
- 设计模式之单例设计模式(懒汉式)
package july.star.thread22; /*** Teacher* 饿汉式:类一加载就加载* 懒汉式:需要时才加载* 面试题:单例模式的思想是什么,请用代码体现.* 开发:饿汉式(不会 ...
- 设计模式之单例设计模式(饿汉式)
//饿汉式:类一加载就创建 //创建单例对象 package july.star.thread22;/*** Student* 创建单例对象* @author MoXingJian* @email 9 ...
- 菜鸟之路-浅谈设计模式之单例设计模式
单例设计模式 定义:确保一个类仅仅有一个实例,并且自行实例化并向整个系统提供这个实例. 单例模式是一种经常使用的软件设计模式.在它的核心结构中仅仅包括一个被称为单例的特殊类. 通过单例模式能够保证系统 ...
- JAVA设计模式之单例设计模式
单例模式,是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例.即一个类只有一个对象实例. 在JAVA中实现单例,必须了 ...
最新文章
- String、StringBuffer、StringBuilder源码解析
- 广州线下活动 | 精益运维与 DevOps 最佳实践
- 添加firefox4的deb源,直接安装
- ZOJ 1610 Count the Colors (线段树区间更新)
- webstorm最新破解方法
- 渗透测试岗位面试题(重点:渗透测试思路)
- 重新启动系统中的network服务器,linux系统调优-Network
- Java动态代理之JDK实现和CGlib实现
- 深度学习自学(三十六):有效提升图像分类噪声鲁棒性的小波卷积网络
- Atitit 服务器运维linux常用命令attilax总结.docx 1. 重要命令	1 1.1. 重启系列	1 1.2. 重启nginx	1 1.3. 重启tomcat	1 2. 其他	2 2
- selenium无头浏览器
- UE4更改天空盒材质
- 怎么把mpg转成mp4,mpg转mp4方法
- vim 插件安装 (ubuntu OS)
- HTML <abbr> 标签简单介绍
- LabVIEW控制Arduino采集多路模拟量、数字量(进阶篇—1)
- php 输入出生年月日计算年纪,PHP实现根据出生年月日计算年龄的功能(代码示例)...
- Deep Face Super-Resolution with Iterative Collaboration论文阅读笔记
- 背书小程序正式上线啦
- 利用tcpcopy引流做模拟在线测试
热门文章
- else应输入一个语句是什么意思_Python学习基础篇 -4: Python中的转弯---分支语句
- python软件是什么原因引起的_Python对程序员重要的原因在哪里?
- 学校计算机数据采集处理系统,中学化学计算机数据采集处理系统实验室装备
- mysql dump工具升级_MySQL数据库升级
- 求10 翻译c语言,求助:谁能帮我翻译下最基础的C语言,我是新手,谢谢了!
- java web 来源页_Java:Java Web--分页效果
- Web项目:解决eclipse中jsp文件报错javax.servlet.http.HttpServlet 提示 was not found on the Java Build Path的错误
- oracle安装缺少,安装oracle11g R2 缺少依赖包
- 东北大学c语言及程序设计,东大20秋学期《C语言及程序设计》在线平时作业1参考...
- pos共识机制_OK区块链60讲 | 第17集:什么是PoS共识机制