java单例模式

news2025/1/16 14:07:18

单例设计模式:Spring中的Bean默认都是单例的。

概念

全世界就只要一个---在整个java程序中,只有这个类的一个实例

比如Student a = new Student(); 就是Student类只创建这一个实例,只能有这一个对象存在

主要解决:一个全局使用的类频繁地创建与销毁。在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)

何时使用:当您想控制实例数目,节省系统资源的时候。

关键代码:构造函数是私有的。

1、为了保证只有一个对象,不能new对象,所以设置构造方法私有。

2、只能通过方法或者属性获取对象,如果通过属性获取,这个属性是可以修改的,所以属性只能

是私有的。所以只能通过方法获取。

3、由于我们不能new对象,所以获取对象的方法定是静态的。属性也得是静态的,因为不是静态的,静态的方法访问不到

缺点:没有接口,不能继承,与单一 职责原则冲突,一 个类应该只关心内部逻辑, 而不关心外面怎么样来实例化。

使用场景:

  • 1、要求生产唯一序列号。

  • 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。

  • 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。

枚举:对象固定,私有构造器

饿汉

类加载后一开始就会创建对象

缺点就是占内存

 

懒汉模式

需要的时候才会去创建对象

好处:节省内存 坏处用的时候才创建稍微有点慢

线程不安全,当创建了100个线程,调用getInstance方法时,可能会有多个线程同时看到没有new,就会执行多次new,调用多次构造方法(也就是会进行多次初始化)

线程安全 给getInstance方法加synchronize锁

 

双重校验锁--安全的懒汉式

我们可以选择不给getInstance方法加synchronize锁,而是在这个方法里面去进行加synchronize锁,因为方法锁的范围太广,其他线程阻塞的范围就大,时间就长。

双锁是懒汉为了解决线程安全演变来的

当多线程调用getInstance,不知道是不是第一次调用,有没有创建对象,所以要判断一下属性是否为空

为空需要创建对象,但是在多线程的情况下,访问这个方法的情况下,多个线程可能会创建多个对象,就不是单例了

所以在判断是不是为空后,需要给这个对象加synchronize锁。

假设第一个线程执行完,接下来的线程就会来进行竞争锁,它还是要继续判断是否为空,不为空,直接return

synchroniz不能防止指令重排序,instance = new Instance () ;可能会发生指令重排序,就是另一个线程会访问到Instance 仍然为空,再次进入到第一个if循环

类属性加volatile的原因:第一个线程加锁之后创建了对象,能够让其他线程及时发现 instance 不是空了,这样其他线程就不用进入第一层判断了,加快了程序速度;如果没有加volatile,不能防止指令重排序,可能对象创建了,但是句柄的地址没有传给属性,判断时还是空,这样就需要继续走第一层if。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10276.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工蜂群优化及其在资源管理中的应用(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

单钩点弹珠/片经验总结

开锁的方向:不要管主驾驶室在车子的左边还是右边,记住朝车头开启就可以。 开锁技巧:我们将HU101工具插入锁孔以后,摆好姿势,先拨动撬杆试探性的去点击弹片,一般我们会发现锁芯里面的弹片主要是下面一些排列…

Mysql系列三:Innodb MVCC版本控制

文章目录一、Innodb MVCC版本控制1、什么是MVCC版本控制?2、Innodb MVCC 核心3、事物版本号、隐藏列、undo log日志的协调工作机制4、Read view5、举例讲解MVCC流程6、InnoDB 引擎不同隔离级别MVCC的区别7、MVCC是否解决了幻读的问题一、Innodb MVCC版本控制 1、什…

项目实战 Java读取Excel数据

项目实战 Java读取Excel数据前言实现步骤导入POI依赖示例Excel表结构编写读取Excel工具类实现思路读取Excel数据工具类实现代码取出从excel中获取的数据,并插入到数据库中总结如果博主的文章对您有所帮助,可以评论、点赞、收藏,支持一下博主!…

jQuery复习

jQuery:是一个js函数库,口号写少 做多 write less do more 封装简化DOM操作(增删改查)/ajax 为什么使用:强大的选择器:方便快速查找DOM元素 隐式遍历:一次监听多个 读写合一:读数据&…

DEFORMABLE DETR学习笔记

DEFORMABLE DETR学习笔记 DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION ABSTRACT DETR最近被提出,以消除在目标检测中需要许多手工设计的组件,同时展示良好的性能。但由于Transformer注意模块在处理图像特征映射时的局…

基于51单片机驱动A4988实现步进电机逆时针转动

基于51单片机驱动A4988实现步进电机逆时针转动一、简介二、接线典型接线图实际接线三、部分代码引脚定义定时器初始化主函数四、实验现象五、注意事项一、简介 A4988 是一款完全的微步电动机驱动器,带有内置转换器,易于操作。该产 品可在全、半、1/4、1…

Synchronized 与 Lock 的使用

Synchronized的使用 以卖票为例 //基本的卖票例子/*真正的多线程开发,公司中的开发,降低耦合性线程就是一个单独的资源类,没有任何附属的操作1.属性、方法*/ public class SaleTicketDemo01 {public static void main(String[] args) {//多个线程操作同…

python 可视化解释模型

1. 自定义DataSet MakeDataset.py 首先准备好一个数据集文件,这里以mydata文件夹存放图片数据, 实现自定义DataSet class MyDataset(Dataset):def __init__(self,resize):super(MyDataset,self).__init__()self.resize resizedef __len__(self):retur…

【软件分析第13讲-学习笔记】符号执行 Symbolic Execution

文章目录前言正文符号执行基于霍尔逻辑的符号执行谓词转换计算最弱前置条件动态符号执行符号执行:进一步探究小结参考文献前言 创作开始时间:2022年11月16日18:46:31 如题,学习一下符号执行 Symbolic Execution的相关知识。参考&#xff1a…

计算机毕业设计jsp家校互动系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 家校互动系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,使用jav…

Linux用户操作(22.9.21)

学习目标: 用户账号管理Linux用户操作Linux用户组操作(一)用户账号管理 1、用户与用户组文件 在Linux系统当中,默认情况下所有用户信息保存在 /etc/passwd文件内,用户密码信息保存在/etc/shadow文件内;所…

43、Spring AMQP TopicExchange

1、TopicExchange 2、案例 3、通过配置类实现 1、配置TopicConfig 2、添加Listener 3、测试结果 4、通过注解实现 1、配置Linstener 2、测试结果 5、总结分析 学到这里,关于RabbitMQ的五种消息模型就结束了。 1、第一种消息模型:单个队列&#xff0c…

相机模型总结

目录相机模型前言1. pinhole 针孔模型2. Omnidirectional Camera Model 全向相机模型2.1 Unified model for catadioptric cameras 反射式相机统一模型2.2 Extended Unified model for catadioptric cameras (EUCM)2.3 Omnidirectional Camera Model By Scaramuzza畸变模型1. E…

linux篇【10】:进程信号

目录 一.信号入门 1.信号是操作系统内一个内置机制 2.前后台进程的几条命令与ctrlc 3.信号分类 4.信号产生是异步的 5.进程是如何记住这个信号 (3)存储方式:位图 二.signal ——对某信号设置自定义行为(捕捉)的函数 (1&a…

【Linux】进程间通信之消息队列

系列目录 进程间通信——共享内存 进程间通信——信号量 文章目录 一、概念 二、消息队列函数 1.msgget 2.magsnd 3.msgrcv 4.msgctl 三、掌握消息队列操作 一、概念 提供了一种从另一种进程发送一个数据块的方法。而且每个数据块都被认为含有一个类型,接…

Python3《机器学习实战》学习笔记(十):ANN人工神经网络代码详解(数字识别案例以及人脸识别案例)

文章目录一、构建基本代码结构1.1预处理数据的工具包1.2 初始化参数1.3工具类sigmoid1.4工具类矩阵变换1.5初始化theta1.6正向传播1.7反向传播1.8梯度下降1.9训练模块二、MNIST数字识别三、人脸识别四、总结一、构建基本代码结构 1.1预处理数据的工具包 """Dat…

2021年认证杯SPSSPRO杯数学建模C题(第一阶段)破局共享汽车求解全过程文档及程序

2021年认证杯SPSSPRO杯数学建模 C题 破局共享汽车 原题再现: 自 2015 年以来,共享汽车行业曾经“百花齐放”,多个项目获得巨额融资。但因为模式过重、运营成本过高、无法盈利等问题,陆续有共享汽车公司因为资金链断裂而倒闭。据…

RocketMQ存储设计的奥妙

RocketMQ作为一款基于磁盘存储的中间件,具有无限积压能力,并提供高吞吐、低延迟的服务能力,其最核心的部分必然是它优雅的存储设计。 1、存储概述 RocketMQ存储的文件主要包括Commitlog文件、ConsumeQueue文件、Index文件。 RocketMQ将所有…

温振传感器有几种传输方式?

在现代化社会中,各种机器无时无刻参与着我们的日常生活,承担在我们的周围承担起重要作用,轴承、电机、泵体等也成为工业文明中关键存在,它们的温度和状态影响着整个工业自动化系统运行的健康和效率。 长期以来,传感器技…