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

延迟加载(Lazy Initialization)的单例模式

延迟加载(Lazy Initialization)的单例模式是一种在对象第一次被请求时才创建单例实例的设计模式。这种方法可以减少程序启动时的负载和启动时间,特别是当单例对象的创建开销较大或者在启动时不一定需要该对象时。

下面是实现延迟加载单例模式的几种常见方法:

1. 懒汉式(线程不安全)

public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

这种实现最简单,但它不是线程安全的。如果多个线程同时访问getInstance()方法,可能会创建多个实例。

2. 懒汉式(线程安全)

public class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

通过添加synchronized关键字,可以使得该方法线程安全,但这会显著降低方法的性能。

3. 双重检查锁定(Double-Checked Locking)

public class Singleton {private static volatile Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

双重检查锁定既可以保证线程安全,也可以减少同步带来的性能影响。volatile关键字确保instance变量的写操作对其他线程立即可见,防止指令重排。

4. 静态内部类(推荐)

public class Singleton {private Singleton() {}private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}

这种方式利用了Java的类加载机制来保证单例实例的唯一性和线程安全。只有当getInstance()方法第一次被调用时,SingletonHolder才会被加载和初始化,这时单例类的实例才会被创建。

5. 枚举实现(最简洁,自动支持序列化机制,绝对防止多次实例化)

public enum Singleton {INSTANCE;public void doSomething() {// Perform operation here}
}

这是实现单例模式的最佳方法之一,因为它更简洁,自动支持序列化机制,防止多次实例化,即使在面对复杂的序列化或反射攻击时。

在实际应用中,选择哪种方式实现延迟加载的单例模式取决于具体需求和场景。如果对性能要求不是很高,并且可以接受synchronized带来的性能开销,可以选择线程安全的懒汉式。如果对性能要求较高,可以使用双重检查锁定或静态内部类方法。如果需要防止序列化破坏单例,可以使用枚举方式实现单例。

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

相关文章:

  • C++三级专项 流感传染
  • 如何用Elementor创建WordPress会员网站
  • 【脑切片图像分割】MATLAB 图像处理 源码
  • 深度学习系列61:在CPU上运行大模型
  • IO接口 2月5日学习笔记
  • Android Studio开发(一) 构建项目
  • stm32flash模拟eeprom
  • 多模态MLLM都是怎么实现的(2)-DDPM
  • QT----写完的程序打包为APK在自己的手机上运行
  • Windows C++ SecurityImpersonation级别:线程临时采用另一个用户(客户端)的身份进行操作的能力
  • 重学SpringBoot3-yaml文件配置
  • 【管理咨询宝藏资料33】某头部咨询公司组织效能提升模型方案
  • 特征值和特征向量及其在机器学习中的应用
  • 【Vue3】Ref 和 ShallowRef 的区别
  • Linux - 进程概念
  • H5小游戏,象棋
  • LLM春招准备(1)
  • 网络安全知识点总结
  • 服务完善的智能组网系统?
  • VS2022如何添加行号?(VS2022不显示行号解决方法)
  • 125.验证回文字符串
  • Spring Boot的启动流程(个人总结,仅供参考)
  • 用BIO实现tomcat
  • JS逆向进阶篇【去哪儿旅行登录】【下篇-逆向Bella参数JS加密逻辑Python生成】
  • 【机器学习】生成对抗网络GAN
  • centos7安装kafka、zookeeper
  • 基于 STM32U5 片内温度传感器正确测算温度
  • 【比较mybatis、lazy、sqltoy、mybatis-flex、easy-query操作数据】操作批量新增、分页查询(三)
  • Leetcode 3068. Find the Maximum Sum of Node Values
  • 用 Dockerfile为镜像添加SSH服务