设计模式——单例模式(Singleton)

单例模式(Singleton Pattern)是设计模式中的一种,它确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。这种模式在多种场景下都非常有用,比如配置文件的读取、数据库连接的创建、线程池的管理等。

实现单例模式的要点:

  1. 私有构造函数:防止其他类通过new关键字创建实例。
  2. 私有静态实例:在类内部定义一个静态的实例变量来保存类的唯一实例。
  3. 公共的静态方法:提供一个公共的静态方法来获取该类的唯一实例。

示例代码(Java):

public class Singleton {// 私有静态实例private static Singleton instance;// 私有构造函数private Singleton() {}// 公共的静态方法(也称为获取器或访问器)public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

注意:上述示例中的getInstance方法使用了synchronized关键字,这是为了保证在多线程环境下的线程安全。但是,这种实现方式在性能上可能不是最优的,因为每次调用getInstance方法时都需要进行同步。

改进的单例模式(双重检查锁定/双检锁):

public class Singleton {// 使用 volatile 关键字来确保 instance 在多线程中的可见性private volatile static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) { // 第一次检查synchronized (Singleton.class) {if (instance == null) { // 第二次检查instance = new Singleton();}}}return instance;}
}

在改进的版本中,我们使用了双重检查锁定(Double-Checked Locking, DCL)来减少同步的开销。同时,我们使用了volatile关键字来确保instance变量在多线程环境下的可见性。这是因为instance = new Singleton();这行代码并不是一个原子操作,它包含了三个步骤:分配内存、初始化对象、将instance指向分配的内存地址。如果没有volatile关键字,编译器可能会进行指令重排序,导致其他线程看到instance不为null,但是对象还没有被完全初始化的情况。

其他实现方式:

除了上述两种常见的实现方式外,还有使用枚举(Enum)、静态内部类等方式来实现单例模式。这些方式在某些场景下可能更加简洁、高效。

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

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

相关文章

Angular中的路由

Angular中的路由 文章目录 Angular中的路由前言一、创建路由二、创建多个组件路由三、创建子路由四、创建多个组件子路由 前言 在Angular中,路由是用于在不同的视图和组件之间导航的机制。Angular提供了一种强大的路由机制来管理单页应用(SPA&#xff0…

vue2项目升级到vue3经历分享4

后端重构,如果接口做好抽象封装,只需要考虑jar之间的兼容性问题,jdk版本不变,基本不用做太大的调整,但是前端就不一样,除了vue框架本身,css的调整,改起来更是让人头疼。前面写了vue2…

Android 开机启动扫描SD卡apk流程源码分析

在开机的时候,装在SD卡的apk和装在系统盘的apk扫描过程不一样,系统盘apk在系统启动过程中扫描,而SD卡上的就不是,等系统启动好了才挂载、扫描,下面就说下SD扫描的流程: 在SystemServer启动MountService&am…

计算机等级考试常见问题

目录 计算机二级报什么好? 计算机等级考试可以直接考4级吗 计算机等级考试包括什么

【Hadoop】MapReduce (七)

MapReduce 执行流程 MapTask执行流程 Read:读取阶段 MapTask会调用InputFormat中的getSplits方法来对文件进行切片切片之后,针对每一个Split,产生一个RecordReader流用于读取数据数据是以Key-Value形式来产生,交给map方法来处理…

02_SpringBoot程序快速启动

目录 打包命令启动启动成功测试结果 打包 点击package打包命令,会生成target目录,目录下会有生成的jar包 命令启动 打开cmd命令窗口,进入子项目的target目录下,输入命令后,回车… java -jar .\note-boot-core-1.0-SNAPSHOT.j…

C++新手村指南:入门基础

目录 C概念 C发展史 C关键字(C98) 命名空间 命名空间的定义 命名空间的使用 C中的输入&&输出 缺省参数 缺省参数的概念 缺省参数的分类 函数重载 函数重载概念 函数重载实现 引用 引用的概念 引用的特性 常引用 引用的使用场景…

【Python图像分类系列】建立CNN模型实现猫狗图像分类(案例+源码)

这是我的第275篇原创文章。 一、引言 基于CNN卷积神经网络在图像识别领域的应用:猫狗图像识别。主要内容包含: 数据创建和预处理 神经网络模型搭建 神经网络模型的训练和拟合 文中使用的深度学习框架是Keras。部分数据展示: 猫&#xf…

基于opencv的车辆统计

车辆统计) 一、项目背景二、整体流程三、常用滤波器的特点四、背景减除五、形态学开运算闭运算 六、项目完整代码七、参考资料 一、项目背景 检测并识别视频中来往车辆的数量 最终效果图: 二、整体流程 加载视频图像预处理(去噪、背景减除…

C++类和对象中篇

🐇 🔥博客主页: 云曦 📋系列专栏:[C] 💨路漫漫其修远兮 吾将而求索 💛 感谢大家👍点赞 😋关注📝评论 文章目录 📔前言📔1、类的六个…

视频汇聚边缘网关EasyCVR硬件设备无法访问域名,解析失败该如何处理?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。视频汇聚融合管理平台EasyCVR既具备传统安防视…

小麦穗检测数据集VOC+YOLO格式6508张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):6508 标注数量(xml文件个数):6508 标注数量(txt文件个数):6508 标注…

实践指南:如何将SpringBoot项目无缝部署到Tomcat服务器

序言 SpringBoot 是一个用来简化 Spring 应用初始搭建以及开发过程的框架,我们可以通过内置的 Tomcat 容器来轻松地运行我们的应用。但在生产环境中,我们可能需要将应用部署到独立的 Tomcat 服务器上。本文给大家介绍 SpringBoot 项目部署到独立 Tomcat…

人工智能培训讲师咨询叶梓介绍及智能医疗技术与ChatGPT临床应用三日深度培训提纲

1、授课老师简介 叶梓,上海交通大学计算机专业博士毕业,高级工程师。主研方向:数据挖掘、机器学习、人工智能。历任国内知名上市IT企业的AI技术总监、资深技术专家,市级行业大数据平台技术负责人。 长期负责城市信息化智能平台的…

Android Jetpack学习系列之WorkManager

一、WorkManager概述 WorkManager 是 Android Jetpack 架构中的关键组件之一,主要用于处理后台任务。它提供了一种简单而可靠的方法来确保即使在应用进程可能被系统杀死、设备可能进入休眠状态、以及操作系统对后台服务的各种限制等困难条件下,后台任务…

JS-拖拽元素放大缩小

效果左右布局&#xff0c;拖拽后&#xff0c;宽度放大缩小 其实自己写也可以&#xff0c;不过还是发现了两个好用的js库&#xff0c;既然不需要自己写&#xff0c;当然是能偷懒就偷懒 1、resizerjs 官网地址&#xff1a;https://github.com/eknowles/resizerjs <!doctype …

ssrf初步

一&#xff0c;简介 全称&#xff1a;Server-Side Request Forgery&#xff08;中文&#xff1a;服务器端请求伪造&#xff09; 攻击者从服务端发起请求&#xff0c;让服务器连接任意外部系统&#xff0c;从而泄露敏感数据。主要利用各种协议的请求伪造&#xff0c;例如php协…

海豚调度器(DolphinScheduler)生产环境问题及解决方案汇总(持续更新)

踩的坑多了,就成为高手了。在开发还是面试时,掌握海豚调度器在生产环境遇到的各种问题,就能证明自己经验丰富。 目录 问题描述:在DolphinScheduler 1.3.5版本中,无法在界面新建Worker分组

IDEA使用Maven生成普通项目没有生成iml文件解决方法

右击主目录选择&#xff1a; Open in Terminal 在生成的控制台输入&#xff1a; mvn idea:module 回车便自动生成iml文件啦&#xff01; 双击下主目录就可以看见啦

数据分析概念定义和发展前景

数据分析概念定义和发展前景 前言一、数据分析概念二、数据的定义数据的定义数据的分类定性数据定量数据 三、数据的价值数据为什么具有价值 四、数据分析的目的对于企业来说总结 五、数据分析类型的划分描述性统计分析探索性数据分析传统的统计分析方法验证性数据分析 六、 数…