Singleton单例模式
1. 简介
定义:
保证一个类仅有一个实例,并提供一个该实例的全局访问点。
注意:
- 单例模型下实例化操作应该是类的设计者的责任,而不是使用者的责任。
- 在该类中直接提供实例化的方法,保证实例唯一
2. 示例
2.1. 最常见的单例模式
public class Singleton
{
//保存实例容器
private static Singleton instance = null;
//取消默认的public的缺省构造器
private Singleton() { }
//实例的出口
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
2.2. 线程安全的单例模式
public class Singleton
{
//volatile 它是被设计用来修饰被不同线程访问和修改的变量。
//如果没有volatile,基本上会导致这样的结果:
//要么无法编写多线程程序,要么编译器失去大量优化的机会。
//volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.
private static volatile Singleton instance = null;
private static object lockHelper = new object();
//取消默认的public的构造器
private Singleton() { }
//实例的出口
public static Singleton Instance
{
get
{
//double check 前面的判断是为了减少后面判断的访问,因为后面的判断会阻塞并发线程
if (instance == null)
{
lock (lockHelper)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
}
2.3. 线程安全且简练的单例模式
利用了静态构造方法是线程安全的。
缺点: 不接受参数
public class Singleton
{
public static readonly Singleton Instance = new Singleton();
private Singleton() { }
}
等价于
public class Singleton
{
public static readonly Singleton Instance;
static Singleton()
{
Instance = new Singleton();
}
private Singleton() { }
}
说明:
- 静态构造器执行时间:在静态字段初始化之前执行。
- 内联初始化编译后会将初始化的内容放到静态构造器内部执行
- 静态构造器只能被一个线程执行一次,不可能被多线程执行
2.4. 含参数的单例模式
一般情况下用不到。
public class Singleton
{
//保存实例容器
private static Singleton instance;
//取消默认的public的构造器
private Singleton(int x,int y)
{
this.x = x;
this.y = y;
}
//实例的出口
public static Singleton GetInstance(int x, int y)
{
if (instance == null)
{
instance = new Singleton(x,y);
}
else
{
instance.x = x;
instance.y = y;
}
return instance;
}
private int x;
private int y;
}
如果您认为这篇文章还不错或者有所收获,您可以通过右边的"打赏"功能 打赏我一杯咖啡【物质支持】,也可以点击左下角的【好文要顶】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力!
作者: 大师兄石头
来源: https://bigbrotherstone.cnblogs.com/
声明: 原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)