饿汉式单例

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 饿汉式单例

1、简介

饿汉式单例与懒汉式单例的区别在于对象的创建时间。

饿汉式单例在类加载时就已经创建了单例对象,所以不存在多线程访问的问题。

因此饿汉式单例是线程安全的。

2、Java代码

饿汉式单例的实现:

1. public class Singleton {
2. private static final Singleton INSTANCE = new Singleton();
3. private Singleton(){}
4. public static Singleton getInstance(){
5. return INSTANCE;
6.     }
7. }

在类加载时已经创建了单例对象,并且它是由static final 修饰的,保证了单例对象在整个程序中都只有一个实例,所以不会有性能问题,并且也不需要额外的同步操作来保证线程安全。但是饿汉式单例在类加载时就创建了单例对象,因此在某些场景下可能会造成内存浪费。

3、应用场景

对比两种方式(饿汉&懒汉),饿汉式单例线程安全,实例马上就会创建,但是会浪费一定的内存空间。

饿汉单例模式适用于单例对象创建开销不大,并且程序启动时需要使用单例对象的场景。

例如,在程序启动时就需要加载的配置信息,可以使用饿汉式单例来读取配置文件。因为在程序启动时就需要加载配置文件,而且配置文件只需要读取一次,所以可以使用饿汉式单例。

一个经典的应用场景就是在 Java 中的日志管理类,下面是一个简单的实现:

1. public class Logger {
2. private static final Logger INSTANCE = new Logger();
3. private Logger(){
4. //初始化
5.     }
6. public static Logger getInstance(){
7. return INSTANCE;
8.     }
9. public void log(String message){
10. //执行日志记录
11.     }
12. }

这个Logger 类负责管理程序中所有的日志信息,因为在类加载时已经创建了 Logger 对象,所以在整个程序中只有一个 Logger 对象,并且是线程安全的。

这样使用时只需要调用Logger.getInstance().log("log message")来记录日志。

还有一个特殊的场景就是在资源限制的情况下,比如设备硬件限制,或者是其他限制条件下,这种情况下因为不能等待长时间创建对象,又因为每个线程都可能会请求单例对象,所以此时就可以使用饿汉单例模式来保证程序在限制条件下的正常运行。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
Kubernetes 调度 容器
正确配置Kubelet可一定程度防止K8S集群雪崩
## Kubelet Node Allocatable - Kubelet Node Allocatable用来为Kube组件和System进程预留资源,从而保证当节点出现满负荷时也能保证Kube和System进程有足够的资源。 - 目前支持cpu, memory, ephemeral-storage三种资源预留。 - Node Capacity是Node的所有硬件资源,kube-r
11293 3
|
9月前
|
安全 算法 数据安全/隐私保护
恶意软件盯上Mac:利用苹果安全工具发起攻击
恶意软件盯上Mac:利用苹果安全工具发起攻击
|
7月前
|
传感器 人工智能 安全
蔚来汽车智能座舱接入通义大模型,并使用通义灵码全面提效
为加速AI应用在企业市场落地,4月9日,阿里云在北京召开AI势能大会。阿里云智能集团资深副总裁、公共云事业部总裁刘伟光发表主题演讲,大模型的社会价值正在企业市场释放,阿里云将坚定投入,打造全栈领先的技术,持续开源开放,为AI应用提速。
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
人工智能的边界拓展:从理论到实践的飞跃####
本文探讨了人工智能(AI)技术的最新进展,特别是深度学习领域的创新如何推动AI从理论研究走向广泛应用。通过分析几个关键领域的实际应用案例,如医疗健康、自动驾驶和自然语言处理,本文揭示了AI技术的潜力及其对社会和经济的深远影响。文章还讨论了当前面临的挑战,包括伦理问题和技术瓶颈,并展望了未来的发展趋势。 ####
|
7月前
|
算法 定位技术 数据安全/隐私保护
基于遗传优化算法的多AGV栅格地图路径规划matlab仿真
本程序基于遗传优化算法实现多AGV栅格地图路径规划的MATLAB仿真(测试版本:MATLAB2022A)。支持单个及多个AGV路径规划,输出路径结果与收敛曲线。核心程序代码完整,无水印。算法适用于现代工业与物流场景,通过模拟自然进化机制(选择、交叉、变异)解决复杂环境下的路径优化问题,有效提升效率并避免碰撞。适合学习研究多AGV系统路径规划技术。
343 12
|
8月前
|
机器学习/深度学习 人工智能 运维
AI和开源时代的计算机课程建设和改革建议
人工智能与开源技术正深刻影响高校计算机教育。通过构建“AI+开源”驱动的课程体系,深化专业课AI融合,强化跨学科项目学习,可培养复合型人才。同时,打造开源实验平台、推广智能教学模式、共建产教融合生态,并加强AI伦理教育,将推动教育数字化转型。Websoft9等工具为连接理论与实践提供支持,助力高校培养适应未来的技术人才。
|
10月前
|
存储 人工智能 物联网
人人都是设计师,挑战0代码打造专属氛围感风格海报!
无需编程和设计基础,借助阿里云PAI ArtLab,轻松实现任意风格的海报设计。通过在线服务PAI-EAS和对象存储OSS,用户可以快速部署ComfyUI环境,上传线稿后一键生成企业风格海报。提供详细的操作步骤和多种风格示例,如岩石废土风、节日圣诞风和假日海洋风,帮助你轻松上手,快速出图。
325 15
|
jenkins Java 测试技术
Jenkins 在持续集成/持续交付(CI/CD)管道中的应用
【8月更文第31天】 在现代软件开发过程中,持续集成(Continuous Integration, CI)和持续交付(Continuous Delivery, CD)已经成为提升开发效率和软件质量的重要实践。Jenkins 是一个广泛使用的开源工具,它能够帮助团队实现自动化构建、测试和部署,是 CI/CD 流水线的核心组件之一。本文将详细介绍 Jenkins 在 CI/CD 管道中的应用,并提供具体的代码示例。
499 0
|
存储 监控 视频直播
对象存储OSS产品概念
对象存储OSS产品概念
252 4
|
Android开发 开发者 UED
使用AlarmManager实现Android应用中的定时任务
使用AlarmManager实现Android应用中的定时任务