java 单例模式(饿汉模式与懒汉模式)

发布时间 - 2026-01-11 03:06:52    点击率:

java 单例模式

饿汉式单例

对于饿汉模式,我们可这样理解:该单例类非常饿,迫切需要吃东西,所以它在类加载的时候就立即创建对象。

懒汉式单例类

对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的时候才会行动,从来不知道及早做好准备。它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果已有对象就不再创建,立即返回。

单例设计模式常用于JDBC链接数据库

注意:

1 我们常用的是第一种饿汉式,因为:

 (1)既然采用了单例设计模式,就是为了使用单例类的对象,所以就先把他实例化出来.

 (2)在懒汉式中存在一定的安全隐患,需要加上同步关键字synchronized,否则就谈不上单例了,但是加上了synchronized效率就稍逊了

2 在第一种办法中,代码private static final Single SINGLE=new Single();为什么有final呢?

因为被final关键字修饰的类,不能被继承,被final修饰的成员变量不可以被修改.

此处用了final为了强化和重点突出:"同一对象"这个概念——只有这么一个对象,而且它是不可以被修改的.

如果不用final修饰 Single SINGLE那么就会有这么一种情况:业务很复杂,在不经意间就修改了此对象,造成各种错误.

第一种(饿汉式):

思路:

(1)不让其他类建立该类的对象.即将构造函数设置为私有!
(2)自定义一个本类对象
(3)将自定义的对象提供出去.即定义一个get方法,返回值为此类的对象。

 分析:

 第一步:将单例类中构造函数私有化了且利用一个get()函数向外提供此类的对象,所以其他类无法构造此类的对象。
 第二步:但其他类要想调用此单例类里的方法,于是只有采用内名.方法名()来实现,这就要求这个方法必须是静态static的。
 第三步:又因为静态方法只能访问静态成员!所以要将SINGLE设置为静态的

public class SingleDemo { 
  public static void main(String[] args) { 
     Single s1=Single.getSingle(); 
     s1.setNumber(44); 
     Single s2=Single.getSingle(); 
     s2.setNumber(55); 
     System.out.println("s1.number="+s1.number); 
     System.out.println("s2.number="+s2.number); 
     if(s1.equals(s2)){ 
        System.out.println("s1与s2是同一对象即:s1==s2");//if条件成立 
       } 
   } 
} 
 
 
class Single{ 
  int number; 
  public int getNumber() { 
       return number; 
     } 
  public void setNumber(int number) { 
       this.number = number; 
     } 
  private Single(){};//第一步 
  private static final Single SINGLE=new Single();//第三步 
  public static Single getSingle(){//第一步和第二步 
       return SINGLE; 
  } 
} 

第二种(懒汉式):

package cn.com; 
public class SingleDemo2 { 
   public static void main(String[] args) { 
      Single s1=Single.getSingle(); 
      s1.setNumber(44); 
      Single s2=Single.getSingle(); 
      s2.setNumber(55); 
      System.out.println("s1.number="+s1.number); 
      System.out.println("s2.number="+s2.number); 
      if(s1.equals(s2)){ 
        System.out.println("s1与s2是同一对象即:s1==s2");//if条件成立 
       } 
     } 
 
 
} 
 
 
class Single{ 
   int number; 
   public int getNumber() { 
       return number; 
     } 
   public void setNumber(int number) { 
       this.number = number; 
     } 
   private Single(){}; 
   private static Single SINGLE=null; 
   public static synchronized Single getSingle(){//多线程时加上synchronized是关键!!! 
      if(SINGLE==null){ 
         SINGLE=new Single(); 
         return SINGLE; 
       } 
      else{ 
         return SINGLE; 
        } 
   } 
} 


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


# java单例模式  # java  # 饿汉模式与懒汉模式  # Java单例模式的应用示例  # JAVA实现单例模式的四种方法和一些特点  # Java单例模式的6种实现方式详解  # java单例模式使用及注意事项  # JAVA多线程并发下的单例模式应用  # 一篇文章教你使用枚举来实现java单例模式  # java设计模式之单例模式学习  # Java中单例模式的7种写法  # Java实现单例模式的五种方式总结  # 此类  # 第一种  # 已有  # 不可以  # 自定义  # 它在  # 设置为  # 第二步  # 第三步  # 的是  # 上了  # 如有  # 才会  # 把他  # 它是  # 本类  # 我们可以  # 这就  # 用了  # 希望能 


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


相关推荐: php485函数参数是什么意思_php485各参数详细说明【介绍】  制作企业网站建设方案,怎样建设一个公司网站?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  如何用景安虚拟主机手机版绑定域名建站?  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  Laravel如何自定义分页视图?(Pagination示例)  使用Dockerfile构建java web环境  如何在新浪SAE免费搭建个人博客?  如何选择PHP开源工具快速搭建网站?  5种Android数据存储方式汇总  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  Swift中swift中的switch 语句  Android滚轮选择时间控件使用详解  如何快速登录WAP自助建站平台?  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  浅谈Javascript中的Label语句  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  如何彻底删除建站之星生成的Banner?  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  iOS发送验证码倒计时应用  JavaScript如何实现类型判断_typeof和instanceof有什么区别  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  网站制作大概多少钱一个,做一个平台网站大概多少钱?  图册素材网站设计制作软件,图册的导出方式有几种?  linux top下的 minerd 木马清除方法  如何在云虚拟主机上快速搭建个人网站?  高端建站三要素:定制模板、企业官网与响应式设计优化  如何基于PHP生成高效IDC网络公司建站源码?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  WEB开发之注册页面验证码倒计时代码的实现  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Laravel如何使用Sanctum进行API认证?(SPA实战)  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  如何在阿里云虚拟服务器快速搭建网站?  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  详解阿里云nginx服务器多站点的配置  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Python文本处理实践_日志清洗解析【指导】  php 三元运算符实例详细介绍