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

单例模式,饿汉式,懒汉式,在java和spring中的体现

目录

饿汉式单例模式

懒汉式单例模式

Spring中的单例模式

关键差异对比

在Java和Spring中的应用场景

手写案例

单例模式是一种创建型设计模式,其核心在于确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。下面将详细介绍饿汉式和懒汉式单例模式,以及它们在Java和Spring框架中的体现。

饿汉式单例模式

这种模式的特点是类加载时就创建实例,无需等待首次使用。它不存在线程安全问题,因为实例的创建是在类加载阶段完成的。

Java实现示例

public class EagerSingleton {private static final EagerSingleton INSTANCE = new EagerSingleton();private EagerSingleton() {}public static EagerSingleton getInstance() {return INSTANCE;}
}

懒汉式单例模式

懒汉式单例模式是在首次使用时才创建实例。不过,在多线程环境下,如果没有合适的同步机制,就可能会创建多个实例。

非线程安全的Java实现示例

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

线程安全的Java实现示例

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

Spring中的单例模式

在Spring框架里,默认情况下,所有的bean都是以单例模式创建的,也就是在整个应用上下文中只存在一个实例。

Spring单例bean示例

@Component
public class SpringSingleton {// Spring会自动管理这个bean的单例实例
}

获取Spring单例bean的方式

@Autowired
private SpringSingleton springSingleton;

关键差异对比

维度

饿汉式

懒汉式(线程安全)

实例创建时机

类加载时

首次调用时

线程安全性

安全

安全

优点

实现简单,无需考虑线程安全问题

延迟加载,节省资源

缺点

可能造成资源浪费

实现较为复杂,性能可能受影响

适用场景

实例创建成本低,且一定会被使用

实例创建成本高,或不一定会被使用

在Java和Spring中的应用场景

  • Java中的应用:像日志记录器、数据库连接池这类需要全局唯一实例的场景,会用到单例模式。
  • Spring中的应用:Spring框架默认将bean配置为单例,这样可以减少内存开销,同时保证状态管理的一致性。

理解单例模式的不同实现方式以及它们在Java和Spring中的应用,有助于设计出高效且线程安全的应用程序。

手写案例

public class Main { }// 单例模式 初始化bean// 饿汉式 单例初始化
// 在类首次加载时就进行初始化 不需要考虑线程安全问题
class  Hungrybean{private static final Hungrybean INSTANCE = new Hungrybean();public static Hungrybean getInstance() {return INSTANCE;}
}// 懒汉式 单例初始化
// 在使用时再进行初始化 可能存在线程安全问题
class  Lazybean{private static Lazybean INSTANCE ;public static Lazybean getInstance() {if(INSTANCE==null){INSTANCE=new Lazybean();}return INSTANCE;}
}// 锁机制 修复了懒汉是的线程安全问题
class ThreadSafeLazybean{private static ThreadSafeLazybean INSTANCE;public static ThreadSafeLazybean getInstance(){if(INSTANCE==null){synchronized (ThreadSafeLazybean.class){if (INSTANCE==null){INSTANCE=new ThreadSafeLazybean();}return INSTANCE;}}}
}

http://www.xdnf.cn/news/658405.html

相关文章:

  • 从数据页角度理解B+树查询
  • Netty学习专栏(五):Netty高性能揭秘(Reactor模式与零拷贝的深度实践)
  • 华为OD机试真题——单词接龙(首字母接龙)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • 股指期货移仓换月技巧是什么?
  • CUDA编程笔记(1)--最简单的核函数
  • 大模型RL方向面试题90道
  • Filter和Interceptor详解(一文了解执行阶段及其流程)
  • CVE-2024-36467 Zabbix权限提升
  • java枚举和mybaits-plus结合实现映射输出和存储
  • VScode怎么运行一个c语言程序
  • ChatGPT与认知科学:人机协同的未来图景
  • STM32 IIC总线死锁问题总结
  • 洛谷——P3372 【模板】线段树 1
  • webpack吐环境分析
  • 为什么使用ollama运行的模型不用gpu也可以使用
  • [攻防世界] easyphp writeup
  • Graph Neural Network(GNN)
  • 如何通过全流量溯源分析系统实现高效的网络质量监控
  • JavaSE核心知识点04工具04-02(IDEA)
  • 关于(stream)流
  • MySQL的基础操作
  • 内网搭建NTS服务器
  • 网络安全之Web渗透加解密
  • 原子操作(Atomic Operations)在SOC中的应用场景
  • 【R语言编程绘图-函数篇】
  • Sparse VideoGen开源:完全无损,视频生成速度加速两倍,支持Wan 2.1、HunyuanVideo等
  • DAY12打卡 启发式算法
  • 基于yjs实现协同编辑页面
  • 学习黑客Metasploit 框架的原理
  • 端午假期 · 粽享欢乐