深入理解设计模式-单例模式(饿汉单例模式、懒汉单例模式、双锁单例模式)
深入理解设计模式-双锁单例模式
文章目录
- 一、什么是单例模式
- 二、应用场景
- 三、优缺点
- 四、代码实现
- 总结
- 结尾
一、什么是单例模式
单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。
许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。
二、应用场景
举一个例子,网站的计数器,一般也是采用单例模式实现,如果你存在多个计数器,每一个用户的访问都刷新计数器的值,这样的话你的实计数的值是难以同步的。但是如果采用单例模式实现就不会存在这样的问题,而且还可以避免线程安全问题。同样多线程的线程池的设计一般也是采用单例模式,这是由于线程池需要方便对池中的线程进行控制 同样,对于一些应用程序的日志应用,或者web开发中读取配置文件都适合使用单例模式,如HttpApplication 就是单例的典型应用。 从上述的例子中我们可以总结出适合使用单例模式的场景和优缺点: 适用场景: 1.需要生成唯一序列的环境 2.需要频繁实例化然后销毁的对象。 3.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。 4.方便资源相互通信的环境
三、优缺点
优点:
1.在内存中只有一个对象,节省内存空间;
2.避免频繁的创建销毁对象,可以提高性能;
3.避免对共享资源的多重占用,简化访问;
4.为整个系统提供一个全局访问点。
缺点:
1.不适用于变化频繁的对象;
2.滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共 享连接池对象的程序过多而出现连接池溢出;
4.如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失;
四、代码实现
饿汉单例模式
public class Singleton1 {private static Singleton1 instance = new Singleton1();private Singleton1(){}public static Singleton1 getInstance(){return instance;}
}
类加载的方式是按需加载,且加载一次。。因此,在上述单例类被加载时,就会实例化一个对象并交给自己的引用,供系统使用;而且,由于这个类在整个生命周期中只会被加载一次,因此只会创建一个实例,即能够充分保证单例,这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。
懒汉单例模式
public class Singleton2 {private static Singleton2 instance;private Singleton2(){}public static Singleton2 getInstance(){if (instance == null) {instance = new Singleton2();}return instance;}
}
我们从懒汉式单例可以看到,单例实例被延迟加载,即只有在真正使用的时候才会实例化一个对象并交给自己的引用。
这种写法起到了Lazy Loading的效果,但是只能在单线程下使用。如果在多线程下,一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。所以在多线程环境下不可使用这种方式。
双锁单例模式
public class Singleton {private volatile static Singleton instance;private Singleton (){}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
双锁模式,进行了两次的判断,第一次是为了避免不要的实例,第二次是为了进行同步,避免多线程问题。由于singleton=new Singleton()对象的创建在JVM中可能会进行重排序,在多线程访问下存在风险,使用volatile修饰signleton实例变量有效,解决该问题。
总结
单例模式的实现方法还有很多。上述是比较经典的实现方式,也是我们应该掌握的几种实现方式。
从这四种实现中,我们可以总结出,要想实现效率高的线程安全的单例,我们必须注意以下两点:
1.尽量减少同步块的作用域;
2.尽量使用细粒度的锁。
结尾
- 感谢大家的耐心阅读,如有建议请私信或评论留言。
- 如有收获,劳烦支持,关注、点赞、评论、收藏均可,博主会经常更新,与大家共同进步
深入理解设计模式-单例模式(饿汉单例模式、懒汉单例模式、双锁单例模式)相关推荐
- 单例模式 (饿汉、懒汉)
单例模式 定义 单例模式的实现 饿汉模式 懒汉模式 线程安全问题分析: 如何解决线程安全问题?? 关键点总结 定义 单例模式,是一种常见的"设计模式" 设计模式: 设计模式是一套经 ...
- java单例设计模式双重_Java 设计模式 ——单例模式(饿汉,懒汉,双重锁,静态内部类)...
设计模式: 是在大量的实践中总结和理论化之后优选的代码结构,编程风格,以及解决问题的思考方式.设计模式免去我们自己再思考和摸索.就像是经典的棋谱,不同的棋局,我们用不同的棋谱 俗称"套路&q ...
- 单例模式——饿汉模式懒汉模式
目录 一.什么是单例模式? 二.单例模式的应用场景 三.两种典型的方式实现单例模式 1.饿汉模式 2.懒汉模式 3.理解懒汉模式和饿汉模式 四.单例模式和线程的关系 1.饿汉模式是否线程安全? 2.懒 ...
- DBCP使用BasicdataSource连接(两种单例模式-----饿汉和懒汉模式)
DBCP使用BasicDataSource连接 BasicDataSource实现DataSource的接口,可以进行简单的数据库连接 第一种:懒汉模式:顾名思义,"懒",只有在调 ...
- 单例模式饿汉模式与懒汉模式
目录 1.什么是单例模式 2.为什么需要单例模式? 3.如何实现单例模式 3.1饿汉方式 3.2懒汉模式 1.什么是单例模式 单例模式是一种设计模式,单例模式能保证某个类在程序中只存在唯一一份实例, ...
- 单例模式,饿汉与懒汉
文章目录 什么是单例模式 单例模式的两种形式 饿汉模式 懒汉模式 懒汉模式与饿汉模式是否线程安全 懒汉模式的优化 什么是单例模式 单例模式其实就是一种设计模式,跟象棋的棋谱一样,给出一些固定的套路帮助 ...
- 单例模式之饿汉和懒汉(java)
文章目录 1.前言 2.怎么区分饿汉和懒汉模式 3. 饿汉 4.懒汉 (双重检查 Double Check Lock) 5.饿汉模式在JDK中的应用(Runtime) 6.相关文章 1.前言 面试时, ...
- 单例模式之饿汉模式懒汉模式
前言 单例模式能保证某个类在程序中只存在唯一一份实例,而不会创建出多个实例,比如 JDBC 中的 DataSource 实例就只需要一个.单例模式具体的实现方式有"饿汉" 和 &q ...
- 单例模式的原理/懒汉模式/饿汉模式以及不同版本的单例模式程序
单例模式 单例模式定义 懒汉模式与饿汉模式 懒汉模式 饿汉模式 懒汉模式和饿汉模式的区别 懒汉模式的不同版本 版本一 版本二 版本三 版本四 单例模式定义 保证一个类仅有一个实例,并提供一个该实例的全 ...
最新文章
- 挖掘机实现“无人驾驶”!协作机器人“魔法之手”取代人工操作
- [转]T4模版引擎之生成数据库实体类
- DND是如何封装WinSock的?
- MapReduce 源码分析(一)准备阶段
- 2018年云栖社区展望(建设性意见非BUG)
- 10款交互设计原型开发工具(转)
- 7-87 吉老师的回归 (15 分)
- Netflix Ribbon 负载均衡 概述 与 基本使用
- 分享几款常用的MySQL管理工具
- DWM1000DISCOVERY开发板简介
- 地图比例尺、瓦片切片方案、EPSG
- Qt涂鸦板及其放大简例
- 新冠病毒对计算机的影响,人工智能给新冠病毒分类
- 智慧营区解决方案-最新全套文件
- 安全浏览器无法安装?看这一篇就够了
- 用VBA生成PDF Adobe Acrobat and VBA – An Introduction
- HTML+CSS+JS大作业——汽车租赁(47页) 加特效 web期末作业设计网页_汽车大学生网页设计作业成品
- maya_mel转python代码插件
- JS中或者(或 or ||)与并且(与 and )
- 七大最具影响力的大数据应用案例
热门文章
- sql server修改数据库排序规则
- VS Code:自定义快捷键(解决快捷键冲突问题)
- MySQL自带的加密AES_ENCRYPT()解密AES_DECRYPT()
- GoldenGate安装说明
- 【深度学习实战】---TensorBoard网络可视化
- 20220623 Adobe Illustrator入门
- linux 运行apj,Linux中设置服务自启动的三种方式
- Learning Based Digital Matting小结
- 使用excel生成九九乘法表
- Java高效率复习-MySQL上篇[MySQL]