当前位置: 首页 > news >正文

Head First Design Patterns - 单例模式

什么是单例模式

  • 单例模式确保应用中,一个类最多只有一个实例
  • 单例模式也提供访问此实例的全局访问点
  • 单例模式实现中,使用了一个私有构造器,一个静态方法以及一个静态变量

为什么要用单例模式

java中静态全局变量也能做到被实例化一次

但是对于全局变量而言,这个全局变量对象可能在应用启动的时候就被创建,如果这个对象是资源密集型的,则长时间没使用,就对资源不是很友好。

单例模式可以使得对象延迟被创建,对于资源密集型的应用来说很重要。

单例模式的实现方式

  1. 简单的实现方式:
public class Singleton {private static Singleton uniqueInstance;// 其他有用的实例变量private Singleton() {};public static Singleton getInstance() {if (uniqueInstance == null) {uniqueInstance = new Singleton();}return uniqueInstance;}

优点:符合单例模式的定义,满足单例模式的要求
缺点:在多线程的环境下,容易产生多个实例

  1. 多线程情况下的同步方式
public class Singleton1 {private static Singleton1 uniqueInstance;// 其他有用的实例变量private Singleton1() {};public static synchronized Singleton1 getInstance() { // synchronized设置成同步的if (uniqueInstance == null) {uniqueInstance = new Singleton1();}return uniqueInstance;}
}

优点:同步方式可以解决多线程并发的问题
缺点:同步锁很重,容易带来性能低下的问题

  1. 饿汉模式,让JVM来保证实例的唯一性
public class Singleton2 {private static Singleton2 uniqueInstance = new Singleton2(); // JVM来保证唯一性private Singleton2() {};public static Singleton2 getInstance() {return uniqueInstance;}
}

优点:让JVM来保证实例的问一下,可以解决多线程带来的并发问题
缺点:使用不够灵活

  1. 双重检查加锁
public class Singleton3 {private volatile static Singleton3 uniqueInstance;private Singleton3() {};public static Singleton3 getInstance() {if (uniqueInstance == null) {synchronized (Singleton3.class) {if (uniqueInstance == null) {uniqueInstance = new Singleton3();}}}return uniqueInstance;}
}

优点:可以解决同步过重的问题
缺点:至少得在java5以上才能运行

  1. 枚举方式实现单例
public enum SingletonEnum {INSTANCE,public void testMethod() {System.out.println("执行了单例类的方法");}
}

优点:真正做到线程安全,避免上述方法隐藏的问题

参考文档:单例模式加锁/枚举

http://www.lryc.cn/news/307205.html

相关文章:

  • Mysql的备份还原
  • 分区表介绍
  • emacs 源码分析(七)
  • Linux运维-Web服务器的配置与管理(Apache+tomcat)(没成功,最后有失败经验)
  • 探讨分布式数据库ID生成解决方案
  • Clickhouse填坑记4:Too many parts问题分析
  • CertiK CSO Dr. Kang Li 确认出席Hack .Summit() 香港区块链盛会
  • C++ 游戏飞机大战, 字符型的
  • 用html编写的简易新闻页面
  • docker-mysql:5.7安装
  • SQLPro Studio:数据库管理的革命性工具 mac版
  • 【小沐学QT】QT学习之OpenGL开发笔记
  • kali安装ARL灯塔(docker)
  • 字节面试分享,请详细介绍为何Http Post发送两次请求
  • Flink CDC 3.0 Starrocks建表失败会导致任务卡主!
  • 基于 LVGL 使用 SquareLine Studio 快速设计 UI 界面
  • Selenium IDE插件录制网页,解放双手
  • 【LeetCode】【滑动窗口长度不固定】978 最长湍流子数组
  • 水库安全监测方案(福建地区水库安全监测案例分享)
  • Oracle内存计算应用模式
  • ELK日志系统
  • C++:list容器(非原生指针迭代器的实现)
  • 抖音视频批量下载软件|视频评论采集工具
  • Oracle RMAN 备份恢复
  • 【MySQL】学习和总结联合查询
  • Flink应用场景
  • 产品渲染3D效果图一张多少钱,哪个平台更有性价比?
  • 云原生之容器编排实践-ruoyi-cloud项目部署到K8S:MySQL8
  • go interface{} 和string的转换问题
  • 【Git教程】(三)提交详解 —— add、commit、status、stach命令的说明,提交散列值与历史,多次提交及忽略 ~