java 中单例模式饿汉式与懒汉式的对比

发布时间 - 2026-01-11 02:49:10    点击率:

java 中单例模式饿汉式与懒汉式的对比

概念:

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

以前我们的做法是设置一个全局变量,也就是让它使得一个对象被访问。但是它不能防止你实例多个对象。这时我们可以让类自身负责保存它的唯一实例,这个类可以保证没有其他实例可以被创建,并且提供一个访问该实例的方法。

通过上面的描述,我们可以看到单例模式有以下特点:

  1、单例类只能有一个实例。
  2、单例类必须自己自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例。

因此,创建一个类的实例的具体方法(要素)是:

      1、 私有的、静态的成员变量
      2、 私有的构造方法
      3、 公共的、静态的一个入口方法

根据上面的具体方法,我们来看一下下面的代码

public class Test { 
  private static Test instance = new Test ();  
   
  private Test (){ 
   
  } 
   
  public static Test GetInstance(){ 
    return instance; 
  } 
} 

从上面的代码中我们看出,当类加载到内存时,在我们调用GetInstance()方法之前,就已经在内存中创建了一个instance对象。也就是说,不管我是否想用这个方法,在内存中就已经存在instance这个对象了,此时这个对象就是多余对象了,这样就会占用内存资源。因此我们将这种单例模式称作“饿汉式”单例模式。其实就是一个“预加载”的过程。

而“懒汉式”单例模式(也就是“延迟式”创建对象)则是在我们需要的时候才去创建这个对象。这样就避免了提前创建对象占用内存资源。



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

但是,通过观察上面的代码,我们可以看出其中还是存在一些问题的。假设,有多个进程同时调用getInstance()方法,这样就可能出现同时创建多个对象,那这就不是单例模式了。因此,我们可以加入“同步”这个关键字使得我们的代码更加的严谨。改进之后是这样的

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

 以上就是java中两种单例模式的对比,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# java  # 中单例模式  # 中单例饿汉式与懒汉式的对比  # Java单例模式的线程安全  # 饿汉和懒汉模式详解  # java 单例模式(懒汉式与饿汉式)  # 关于单例模式懒汉式和饿汉式的区别及说明  # 多个  # 我们可以  # 提供一个  # 有一个  # 自己的  # 我是  # 加载  # 这一  # 就会  # 是这样  # 如有  # 则是  # 两种  # 这就  # 希望能  # 可以看到  # 可以看出  # 让它  # 谢谢大家  # 想用 


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


相关推荐: Laravel怎么为数据库表字段添加索引以优化查询  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  Laravel如何创建自定义Facades?(详细步骤)  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  高端建站如何打造兼具美学与转化的品牌官网?  如何在IIS服务器上快速部署高效网站?  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  Linux安全能力提升路径_长期防护思维说明【指导】  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  微信小程序 canvas开发实例及注意事项  Java遍历集合的三种方式  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  EditPlus中的正则表达式实战(5)  Laravel如何处理和验证JSON类型的数据库字段  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  HTML 中动态设置元素 name 属性的正确语法详解  佛山企业网站制作公司有哪些,沟通100网上服务官网?  Laravel怎么使用artisan命令缓存配置和视图  昵图网官方站入口 昵图网素材图库官网入口  Laravel distinct去重查询_Laravel Eloquent去重方法  如何在阿里云服务器自主搭建网站?  详解MySQL数据库的安装与密码配置  简历在线制作网站免费版,如何创建个人简历?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  创业网站制作流程,创业网站可靠吗?  如何快速搭建FTP站点实现文件共享?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  制作电商网页,电商供应链怎么做?  如何在云主机快速搭建网站站点?  如何解决hover在ie6中的兼容性问题  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  在线教育网站制作平台,山西立德教育官网?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  如何实现javascript表单验证_正则表达式有哪些实用技巧  JavaScript实现Fly Bird小游戏  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  如何在橙子建站中快速调整背景颜色?  利用vue写todolist单页应用  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  如何在Windows虚拟主机上快速搭建网站?  如何快速辨别茅台真假?关键步骤解析