java懒汉和饿汉模式的区别

发布时间 - 2025-12-27 00:00:00    点击率:
饿汉模式在类加载时创建实例,由JVM保证线程安全,实现简单但可能浪费资源;2. 懒汉模式在首次调用getInstance时创建,支持延迟加载,节省内存,但需通过volatile和双重检查锁定确保线程安全;3. 两者主要区别在于实例化时机、资源利用、线程安全和性能,选择取决于是否需要延迟加载及对性能与安全的要求。

懒汉模式和饿汉模式是Java中实现单例模式的两种常见方式,它们的核心区别在于实例化时机线程安全性

饿汉模式(Eager Initialization)

饿汉模式在类加载时就创建实例,不管是否会被使用。

  • 实例在类加载阶段就完成初始化,由JVM保证线程安全。
  • 实现简单,没有多线程同步问题。
  • 缺点是可能造成资源浪费,如果该实例一直没被使用,也会被创建。
示例代码:
public class Singleton {
    private static final Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}

懒汉模式(Lazy Initialization)

懒汉模式在第一次调用getInstance()方法时才创建实例。

  • 延迟加载,节省内存,只有在需要时才创建对象。
  • 普通写法存在线程安全问题,多个线程同时调用getInstance()可能生成多个实例。
  • 可通过加锁(如synchronized)解决线程安全,但会影响性能。
基础线程安全实现(双重检查锁定):
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;
    }
}

主要区别总结

  • 创建时间:饿汉在类加载时创建,懒汉在首次使用时创建。
  • 资源利用:饿汉可能浪费资源,懒汉更节省内存。
  • 线程安全:饿汉天然线程安全,懒汉需额外处理才能保证安全。
  • 性能:饿汉获取实例快,懒汉首次获取稍慢(尤其加锁后)。
基本上就这些。选择哪种方式取决于是否需要延迟加载以及对性能和安全的要求。


# java  # 区别  # 延迟加载 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  Laravel如何使用withoutEvents方法临时禁用模型事件  Android滚轮选择时间控件使用详解  独立制作一个网站多少钱,建立网站需要花多少钱?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  高防服务器:AI智能防御DDoS攻击与数据安全保障  javascript基于原型链的继承及call和apply函数用法分析  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  SQL查询语句优化的实用方法总结  创业网站制作流程,创业网站可靠吗?  如何有效防御Web建站篡改攻击?  如何快速建站并高效导出源代码?  Laravel如何集成Inertia.js与Vue/React?(安装配置)  iOS正则表达式验证手机号、邮箱、身份证号等  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  Android自定义listview布局实现上拉加载下拉刷新功能  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  如何快速生成ASP一键建站模板并优化安全性?  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  Internet Explorer官网直接进入 IE浏览器在线体验版网址  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  Laravel如何使用.env文件管理环境变量?(最佳实践)  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  linux top下的 minerd 木马清除方法  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  Linux安全能力提升路径_长期防护思维说明【指导】  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  Laravel如何与Pusher实现实时通信?(WebSocket示例)  JavaScript中的标签模板是什么_它如何扩展字符串功能  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  如何在IIS中新建站点并解决端口绑定冲突?  Laravel定时任务怎么设置_Laravel Crontab调度器配置  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  如何选择可靠的免备案建站服务器?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  jquery插件bootstrapValidator表单验证详解  如何快速搭建FTP站点实现文件共享?  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  网站制作壁纸教程视频,电脑壁纸网站?  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】