单例模式详解

单例模式

1. 概述

单例模式是一种创建型设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点以获取该实例。这种模式有助于控制资源的访问、管理全局配置或共享状态,确保系统中某个类只存在一个实例。

2. 目的

确保一个类仅有一个实例,且提供全局访问点,以便其他类可以轻松访问该实例。

3. 实现方式

3.1 懒汉式单例(Lazy Initialization)

懒汉式单例通过延迟实例化的方式,在第一次使用时才创建实例。这通常通过加锁来保证在多线程环境下只创建一个实例。

public class Singleton
{private static Singleton instance;private static readonly object lockObject = new object();
​private Singleton() { }
​public static Singleton Instance{get{lock (lockObject){if (instance == null){instance = new Singleton();}}return instance;}}
}

优点

  • 延迟加载,节省资源。

缺点

  • 多线程环境下可能会创建多个实例,需要使用锁机制保证线程安全。

3.2 饿汉式单例(Eager Initialization)

饿汉式单例在类加载时就创建实例,保证在任何线程访问之前已经存在一个实例。

public class Singleton
{private static readonly Singleton instance = new Singleton();
​private Singleton() { }
​public static Singleton Instance{get { return instance; }}
}

优点

  • 在程序启动时就进行实例化,线程安全。

缺点

  • 可能在程序启动时就占用资源。

3.3 双检锁/双重校验锁(Double-Checked Locking)

双检锁单例在检查实例是否存在时使用了两次检查,一次在没有锁的情况下,另一次在加锁的情况下。

public class Singleton
{private static Singleton instance;private static readonly object lockObject = new object();
​private Singleton() { }
​public static Singleton Instance{get{if (instance == null){lock (lockObject){if (instance == null){instance = new Singleton();}}}return instance;}}
}

优点

  • 在实例为 null 的情况下才进行加锁,提高性能。

缺点

  • 需要考虑多线程情况下的双检查,确保线程安全。

3.4 静态初始化单例

静态初始化单例通过静态构造函数在类加载时完成实例化。

public class Singleton
{// 使用静态 readonly 字段确保线程安全的初始化private static readonly Singleton instance;
​// 私有构造函数,防止外部直接实例化private Singleton() { }
​// 静态构造函数用于初始化实例static Singleton(){instance = new Singleton();}
​// 全局访问点public static Singleton Instance{get { return instance; }}
}

优点

  • 利用静态初始化的线程安全特性,保证了只有一个实例。

缺点

  • 无法进行延迟加载,可能在程序启动时就占用资源。

4. 选择单例模式的需求和场景

选择单例模式的实现方式取决于具体的需求和应用场景。懒汉式和饿汉式适用于不同的情况,而双检锁和静态初始化单例则是对性能和资源占用的一些折中选择。在多线程环境下,需要特别注意实现的线程安全性,可以使用锁机制或者其他线程安全的方式来保证单例的唯一性。选择合适的单例模式实现,可以在系统中提供高效且唯一的实例。

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

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

相关文章

Python实现多元线性回归模型信用卡客户价值预测项目源码+数据+项目设计报告

多元线性回归——信用卡客户价值预测 一、背景 这里以信用卡客户的客户价值为例来解释客户价值预测的具体含义: 客户价值预测就是指预测客户在未来一段时间内能带来多少利润,其利润可能来自信用卡的年费、取现手续费、分期手续费、境外交易手续费等。分…

三、万语始于HelloWorld,万物基于点灯之瑞萨RX23E-A 3线RTD PT100测温

一、概述/目的 二、RX23E-APT100三线制 2.1 资料来源 2.2 接线图 2.3 工程配置AFE24ΔΣADCPGA 2.4 代码 2.5 IIR数字滤波器 三、方案对比 三、万语始于HelloWorld,万物基于点灯之瑞萨RX23E-A 3线RTD PT100测温 一、概述/目的 介绍工业过程控制…

DAPLink源码固件编译与制作

DAPLink源码固件编译与制作 ✨这里以Air/stm32f103cbt6固件编译为例。📌DAPLink源码地址:https://github.com/ARMmbed/DAPLink🔖 如果不想自己生成,可以使用合宙提供的现成的工程以及固件;https://gitee.com/openLuat/…

官方指定Jmeter配置JVM堆内存方式

1.概述 在使用Jmeter做性能测试过程中,可能会应为默认设置的堆内存值较小出现堆内存溢出问题,此时解决的方式有两种,分布式测试和调大堆内存。下面介绍官方推荐调整堆内存方法。 2.调整Jmeter堆内存 2.1.介绍官方推荐堆内存调整方法(jmete…

stable diffusion 极简入门 核心 概念介绍 使用

一、怎么写提示词(prompt) 1.1 结构 一般分三部分,按从前到后的顺序:画面质量or风格、画面主体内容、其他细节/背景。 画面质量:如,masterpiece,best quality,highly detailed画面主体内容:如…

Android Studio 显示Cause: connect timed out

在启动其他地方复制下来的项目时,可能会出现Cause: connect timed out报错,大概率由于项目与AndroidStudio使用的Gradle 版本不一致导致。 请检查,包名 / gradle / wrapper / gradle-wrapper.properties 文件 ,文件中的distribut…

mysql原理--连接的原理

1.连接简介 1.1.连接的本质 为了故事的顺利发展,我们先建立两个简单的表并给它们填充一点数据: mysql> CREATE TABLE t1 (m1 int, n1 char(1)); mysql> CREATE TABLE t2 (m2 int, n2 char(1)); mysql> INSERT INTO t1 VALUES(1, a), (2, b), (…

攻防世界-web-ics07

1. 题目描述 工控云管理系统项目管理页面解析漏洞 打开链接,是这样的一个界面 我们点击项目管理 可以看到,这里有一个查询界面,还有个view-source的链接,我们点击下view-source,可以看到这里面共有三段php代码 第一段…

在Spring Cloud中使用Zuul网关实现一个案例

本篇依旧是在Spring Cloud系列的博主已经搭建的Spring Cloud微服务模块上进行的,注意,本文依旧适合初学者和或者在Spring Cloud框架了解不是很深入的基础的开发者,本系列说不上有多高大上,博主坚持通过简单的案例,让开…

JavaFX实现简单下雨动效

下雨动效可以使用JavaFX的动画功能来实现。下面是一个简单的示例代码,实现了一个下雨的动画效果: import javafx.animation.Animation; import javafx.animation.KeyFrame; import javafx.animation.KeyValue; import javafx.animation.Timeline; import javafx.application…

嵌入式中GPIO的工作原理-面试工作必会技能

GPIO工作方式 1、4种输入模式 输入浮空输入上拉输入下拉模拟输入 如下图为GPIO的基本结构,它主要由4部分组成,其中我们所看到的的最右边的I/O引脚,也就是芯片外接可看到的引脚,其它的部分都是GPIO内部的结构。 ①保护二极管 保护…

【新版HI3559AV100开发注意事项(二)】

#新版HI3559AV100开发注意事项(二) 十一、请问海思HI3559AV100 SPC030资料里面的HI3559ADMEB_VER_C_PCB.pcb是用什么软件打开啊? 答:PADS VX 2.2 Altium designer 十二、hi3559级联问题请教 在SDK的文档中只看到了两块Hi3559板…

服务器数据恢复-EMC存储raid5磁盘物理故障离线的数据恢复案例

服务器数据恢复环境&故障: 一台emc某型号存储服务器,存储服务器上组建了一组raid5磁盘阵列,阵列中有两块磁盘作为热备盘使用。存储服务器在运行过程中有两块磁盘出现故障离线,但是只有一块热备盘激活,最终导致该ra…

力扣:204. 计数质数(Python3)

题目: 给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。 来源:力扣(LeetCode) 链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 示例: 示例 1: 输…

【️如何理解Java中的多态】

✅如何理解Java中的多态? ✅理解Java中的多态 ✅ 扩展知识仓✅方法的重载✅方法的重写✅重载和重写的区别区分 ✅理解Java中的多态 多态的概念比较简单,就是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。 如果…

Java 中的内部类的定义

目录 一、成员内部类 二、静态内部类 三、局部内部类 四、匿名内部类 一、成员内部类 public class InnerClass {String name;private Integer age;static String hobby;/*** 成员内部类* 1、成员内部类中只能定义非静态属性和方法* 2、成员内部类中可以访问外部类的成员&a…

vue3表格导入导出.xlsx

在这次使用时恰好整出来了,希望大家也能学习到,特此分享出来 使用前确保安装以下模块,最好全局配置element-plus ### 展示一下 ### ###导出选项 ### ###导入de数据 ### 安装的模块 npm install js-table2excel // 安装js-table2excel n…

自动化测试工具选择指南

随着软件开发周期的不断缩短和需求的增加,自动化测试变得愈发重要。然而,选择适合项目的自动化测试工具并非易事。以下是一些指导原则,帮助你在众多自动化测试工具中做出明智的选择。 1. 项目需求分析 在选择自动化测试工具之前,首…

0x25 广度优先搜索

0x25 广度优先搜索 在0x21节中,我们介绍了图的广度优先遍历,在0x22节中,我们又定义了深度优先搜索过程产生的“搜索树”结构。如果我们把问题状态空间类比成一张图,那么广度优先搜索就是相当于对这张图的广度优先遍历。类似地&am…

海康威视对讲广播系统 RCE漏洞复现(CVE-2023-6895)

0x01 产品简介 Hikvision Intercom Broadcasting System是中国海康威视(Hikvision)公司的一个对讲广播系统。 0x02 漏洞概述 Hikvision Intercom Broadcasting System 3.0.3_20201113_RELEASE(HIK)版本存在操作系统命令注入漏洞,该漏洞源于文件/php/ping.php的参数jsonda…