0

0

C# 单例模式实现方法 C#如何实现线程安全的单例模式

畫卷琴夢

畫卷琴夢

发布时间:2026-01-26 13:00:47

|

444人浏览过

|

来源于php中文网

原创

直接 new Singleton() 不行,因静态字段初始化在多线程下不保证原子性,且无法延迟加载或控制时机;推荐用 Lazy 实现线程安全单例。

c# 单例模式实现方法 c#如何实现线程安全的单例模式

为什么直接 new Singleton() 不行

单例的核心是“全局唯一实例”,但裸写 private static Singleton instance = new Singleton(); 会触发类静态字段初始化,而 C# 的静态构造函数和字段初始化顺序在多线程下不保证原子性——尤其在 .NET Framework 早期版本中,可能创建多个实例。更关键的是,它无法控制初始化时机(比如依赖配置加载后才该创建),也不支持延迟加载

推荐用 Lazy 实现线程安全单例

Lazy 是 .NET 4.0+ 内置的线程安全延迟初始化类型,默认使用 LazyThreadSafetyMode.ExecutionAndPublication,能确保只执行一次工厂逻辑、且所有线程看到的都是同一个实例。

  • 无需手动加锁,无死锁风险
  • 初始化失败会缓存异常,后续调用直接抛出,行为可预测
  • 支持传入自定义工厂函数,便于注入依赖或做条件判断
public sealed class Singleton
{
    private static readonly Lazy _instance = new Lazy(() => new Singleton());
public static Singleton Instance => _instance.Value;

private Singleton() { } // 私有构造,防止外部 new

}

双重检查锁定(DCL)还能用吗

能用,但必须严格满足三个条件:字段用 volatile、两次判空、锁内再次判空。稍有遗漏就会在 x86/x64 指令重排下失效,导致部分线程拿到未完全构造的对象(表现为字段为默认值或 NullReferenceException)。

MallWWI新模式返利商城系统
MallWWI新模式返利商城系统

MallWWI新模式返利商城系统基于成熟的飞蛙商城系统程序框架,支持多数据库配合,精美的界面模板,人性化的操作体验,完备的订单流程,丰富的促销形式,适合搭建稳定、高效的电子商务平台。创造性的完美整合B2B\B2C\B2S\C2B\C2C\P2C\O2O\M2C\B2F等模式,引领“互联网+”理念,实现商家联盟体系下的线上线下全新整合销售方式,独创最流行的分红权返利与排队返钱卡功能。安全、稳定、结构

下载
  • volatile 防止编译器/CPU 重排构造函数指令
  • 第一次判空避免无谓加锁;第二次判空防止多个线程同时通过第一层检查后重复初始化
  • .NET Core 2.1+ 对 volatile 语义更严格,但 DCL 仍比 Lazy 多出几条 IL 指令和锁开销
public sealed class Singleton
{
    private static volatile Singleton _instance;
    private static readonly object _lock = new object();
public static Singleton Instance
{
    get
    {
        if (_instance == null)
        {
            lock (_lock)
            {
                if (_instance == null)
                    _instance = new Singleton();
            }
        }
        return _instance;
    }
}

private Singleton() { }

}

静态构造函数方式的隐含限制

写成 static Singleton() { _instance = new Singleton(); } 看似简洁,但它会在**首次访问任意静态成员或创建实例时触发**,时机不可控;而且一旦抛出异常,该类型将永久不可用(TypeInitializationException),连 Instance 属性都无法再访问。

  • 无法捕获初始化异常并降级处理
  • 不支持参数化构造(比如读取 appsettings.json 后再创建)
  • 在 ASP.NET Core 中,若单例依赖 IConfiguration,静态构造函数根本拿不到服务提供者

真正需要“绝对首次访问即创建”的场景极少,多数时候反而要避开它。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

418

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

535

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

76

2025.09.10

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

69

2025.10.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

502

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

144

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.21

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

14

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.5万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号