深入理解设计模式-双锁单例模式

文章目录

  • 一、什么是单例模式
  • 二、应用场景
  • 三、优缺点
  • 四、代码实现
  • 总结
  • 结尾

一、什么是单例模式

单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。
许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。


二、应用场景

举一个例子,网站的计数器,一般也是采用单例模式实现,如果你存在多个计数器,每一个用户的访问都刷新计数器的值,这样的话你的实计数的值是难以同步的。但是如果采用单例模式实现就不会存在这样的问题,而且还可以避免线程安全问题。同样多线程的线程池的设计一般也是采用单例模式,这是由于线程池需要方便对池中的线程进行控制 同样,对于一些应用程序的日志应用,或者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.尽量使用细粒度的锁。

结尾

  • 感谢大家的耐心阅读,如有建议请私信或评论留言。
  • 如有收获,劳烦支持,关注、点赞、评论、收藏均可,博主会经常更新,与大家共同进步

深入理解设计模式-单例模式(饿汉单例模式、懒汉单例模式、双锁单例模式)相关推荐

  1. 单例模式 (饿汉、懒汉)

    单例模式 定义 单例模式的实现 饿汉模式 懒汉模式 线程安全问题分析: 如何解决线程安全问题?? 关键点总结 定义 单例模式,是一种常见的"设计模式" 设计模式: 设计模式是一套经 ...

  2. java单例设计模式双重_Java 设计模式 ——单例模式(饿汉,懒汉,双重锁,静态内部类)...

    设计模式: 是在大量的实践中总结和理论化之后优选的代码结构,编程风格,以及解决问题的思考方式.设计模式免去我们自己再思考和摸索.就像是经典的棋谱,不同的棋局,我们用不同的棋谱 俗称"套路&q ...

  3. 单例模式——饿汉模式懒汉模式

    目录 一.什么是单例模式? 二.单例模式的应用场景 三.两种典型的方式实现单例模式 1.饿汉模式 2.懒汉模式 3.理解懒汉模式和饿汉模式 四.单例模式和线程的关系 1.饿汉模式是否线程安全? 2.懒 ...

  4. DBCP使用BasicdataSource连接(两种单例模式-----饿汉和懒汉模式)

    DBCP使用BasicDataSource连接 BasicDataSource实现DataSource的接口,可以进行简单的数据库连接 第一种:懒汉模式:顾名思义,"懒",只有在调 ...

  5. 单例模式饿汉模式与懒汉模式

    目录 1.什么是单例模式 2.为什么需要单例模式? 3.如何实现单例模式 3.1饿汉方式 3.2懒汉模式 1.什么是单例模式 单例模式是一种设计模式,单例模式能保证某个类在程序中只存在唯一一份实例, ...

  6. 单例模式,饿汉与懒汉

    文章目录 什么是单例模式 单例模式的两种形式 饿汉模式 懒汉模式 懒汉模式与饿汉模式是否线程安全 懒汉模式的优化 什么是单例模式 单例模式其实就是一种设计模式,跟象棋的棋谱一样,给出一些固定的套路帮助 ...

  7. 单例模式之饿汉和懒汉(java)

    文章目录 1.前言 2.怎么区分饿汉和懒汉模式 3. 饿汉 4.懒汉 (双重检查 Double Check Lock) 5.饿汉模式在JDK中的应用(Runtime) 6.相关文章 1.前言 面试时, ...

  8. 单例模式之饿汉模式懒汉模式

    前言 单例模式能保证某个类在程序中只存在唯一一份实例,而不会创建出多个实例,比如 JDBC 中的 DataSource 实例就只需要一个.单例模式具体的实现方式有"饿汉" 和 &q ...

  9. 单例模式的原理/懒汉模式/饿汉模式以及不同版本的单例模式程序

    单例模式 单例模式定义 懒汉模式与饿汉模式 懒汉模式 饿汉模式 懒汉模式和饿汉模式的区别 懒汉模式的不同版本 版本一 版本二 版本三 版本四 单例模式定义 保证一个类仅有一个实例,并提供一个该实例的全 ...

最新文章

  1. 挖掘机实现“无人驾驶”!协作机器人“魔法之手”取代人工操作
  2. [转]T4模版引擎之生成数据库实体类
  3. DND是如何封装WinSock的?
  4. MapReduce 源码分析(一)准备阶段
  5. 2018年云栖社区展望(建设性意见非BUG)
  6. 10款交互设计原型开发工具(转)
  7. 7-87 吉老师的回归 (15 分)
  8. Netflix Ribbon 负载均衡 概述 与 基本使用
  9. 分享几款常用的MySQL管理工具
  10. DWM1000DISCOVERY开发板简介
  11. 地图比例尺、瓦片切片方案、EPSG
  12. Qt涂鸦板及其放大简例
  13. 新冠病毒对计算机的影响,人工智能给新冠病毒分类
  14. 智慧营区解决方案-最新全套文件
  15. 安全浏览器无法安装?看这一篇就够了
  16. 用VBA生成PDF Adobe Acrobat and VBA – An Introduction
  17. HTML+CSS+JS大作业——汽车租赁(47页) 加特效 web期末作业设计网页_汽车大学生网页设计作业成品
  18. maya_mel转python代码插件
  19. JS中或者(或 or ||)与并且(与 and )
  20. 七大最具影响力的大数据应用案例

热门文章

  1. sql server修改数据库排序规则
  2. VS Code:自定义快捷键(解决快捷键冲突问题)
  3. MySQL自带的加密AES_ENCRYPT()解密AES_DECRYPT()
  4. GoldenGate安装说明
  5. 【深度学习实战】---TensorBoard网络可视化
  6. 20220623 Adobe Illustrator入门
  7. linux 运行apj,Linux中设置服务自启动的三种方式
  8. Learning Based Digital Matting小结
  9. 使用excel生成九九乘法表
  10. Java高效率复习-MySQL上篇[MySQL]