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

单例模式(饿汉模型,懒汉模型)

在着里我们先了解什么是单例模式。

就是某个类在进程中只能有单个实例,这里的单例模式需要一定的编程技巧,做出限制,一旦程序写的有问题,创建了多个实例,编程就会报错。

如果我们学会了单例模式,这种模式会提高我们的下限。

其中单例模式包含了两种模型,一种是饿汉模型,另一种是懒汉模型,这里的懒汉模型尤为重要,面试也会考。


饿汉模型


这里的单列就是指一个对象,instance。

如代码:

class Singleton {private static Singleton instance = new Singleton();public static Singleton getInstance(){return instance;}
}

这里我们采用 static 来修饰 instance ,因为当初始化的时候只执行一次。

还有当我们想要获取 instance 变量的时候,直接调用getInstance方法就行了,这样我们不用重新在new了。

上述的代码,是饿汉模型。


懒汉模型


这里的懒汉模型不是在程序创建的时候new,而是第一次使用的时候才去创建,这样就可以节省当不用时,我们不用创建的开销。

如代码:

class SingletonLazy {private static SingletonLazy instance = null;public SingletonLazy getinstance(){if(instance == null){instance = new SingletonLazy();}return instance;}}

如上述代码,我们可以看到,就是调用的时候就用。

那么,如果这样是否会引起线程安全问题呢?

答案会引起线程安全问题。

在这里我们当有两个线程同时运行的时候,其线程1和线程2,同时进入if判定,都为true,此时我们就会出现两个,new了,直接就报错了。

那么这里我们加上锁之后,会不会线程安全了呢?

如代码:

class SingletonLazy {private static SingletonLazy instance = null;public static Object locker = new Object();public SingletonLazy getinstance(){if(instance == null){synchronized (locker){instance = new SingletonLazy();}}return instance;}}

这里加上锁也是不安全的,我们具体分析一下。还是两个线程,当出现这种执行顺序时,

如图:

由图中我们可以知道,这种加锁,仍会 new两个。

在这里我们可以采用双重 if 来解决这种线程安全问题。

如代码:

class SingletonLazy {private static SingletonLazy instance = null;public static Object locker = new Object();public SingletonLazy getinstance(){if(instance == null){synchronized (locker){if(instance == null){instance = new SingletonLazy();}}}return instance;}}

如代码,我们在锁里面再加个 if 就可以避免 两个new了,使线程安全。

http://www.lryc.cn/news/335446.html

相关文章:

  • torchvision中的数据集使用
  • linux 迁移home目录以及修改conda中pip的目录,修改pip安装路径
  • 解析大语言模型训练三阶段
  • 知识图谱的最新进展与未来趋势
  • Facebook直播延迟过高是为什么?
  • CentOS 7.9 额外安装一个Python3.x版本详细教程
  • uml时序图中,消息箭头和消息调用箭头有什么区别
  • 12.C++常用的算法_遍历算法
  • hadoop:案例:将顾客在京东、淘宝、多点三家平台的消费金额汇总,然后先按京东消费额排序,再按淘宝消费额排序
  • 2024年华为OD机试真题-孙悟空吃蟠桃-Python-OD统一考试(C卷)
  • vue3 开发中遇到的问题
  • Vue input密码输入框自定义密码眼睛icon
  • 【LAMMPS学习】八、基本知识的讨论(1.4)多副本模拟
  • SpringBoot整合RabbitMQ-应答模式
  • 51单片机入门_江协科技_25~26_OB记录的笔记_蜂鸣器教程
  • 新能源汽车电池包为什么不通用,车主怎么用电才算对?
  • [C语言]——柔性数组
  • 密码学 总结
  • 尚硅谷html5+css3(1)html相关知识
  • 苍穹外卖11(Apache ECharts前端统计,营业额统计,用户统计,订单统计,销量排名Top10)
  • 大商创多用户商城系统 多处SQL注入漏洞复现
  • 美团一面4/9
  • ubuntu下NTFS分区无法访问挂载-解决办法!
  • 如何在 Ubuntu 14.04 上使用 Rsyslog、Logstash 和 Elasticsearch 实现日志集中管理
  • mapbox 工作问题暂时记录
  • Linux、Docker、Brew、Nginx常用命令
  • 【Spring实战项目】SpringBoot3整合WebSocket+拦截器实现登录验证!从原理到实战
  • 第二证券|政策利好不断,工业母机概念爆发,华东数控等涨停
  • Thinkphp5萤火商城B2C小程序源码
  • PostgreSQL介绍