0

0

c# lock(typeof(MyClass)) 这种写法的风险是什么

幻夢星雲

幻夢星雲

发布时间:2026-02-11 00:01:26

|

571人浏览过

|

来源于php中文网

原创

lock(typeof(MyClass))会锁住整个类型而非实例,因为每个类型在AppDomain或AssemblyLoadContext中仅有一个全局唯一的Type实例,所有对该类型的lock调用均争抢同一把锁,形成跨类、跨模块的隐式全局锁,易引发意外阻塞、第三方干扰及多上下文竞态等问题。

c# lock(typeof(myclass)) 这种写法的风险是什么

为什么 lock(typeof(MyClass)) 会锁住整个类型而不是实例

因为 typeof(MyClass) 返回的是运行时的 Type 对象,而每个类型在 AppDomain(或 .NET Core/.NET 5+ 的 AssemblyLoadContext)中只有一个全局唯一的 Type 实例。所有对该类型的 lock(typeof(MyClass)) 调用,本质上都在争抢同一把锁 —— 即使发生在完全无关的类、模块甚至第三方库中。

它和 lock(this)private static readonly object _lock = new() 的关键区别

前者是**跨类、跨模块、跨调用栈的隐式全局锁**;后两者作用域明确、可控。常见后果包括:

  • 不同业务逻辑(比如日志初始化和配置加载)意外串行,导致本可并发的操作被阻塞
  • 第三方 NuGet 包若也用了 lock(typeof(MyClass))(尤其在通用工具类里),你的代码可能被它拖慢,反之亦然
  • 在 ASP.NET Core 等多租户场景下,一个请求卡住 lock(typeof(Startup)),可能让所有后续请求排队等待
  • 单元测试并行执行时,多个测试用例因共享同一 Type 锁而相互干扰,出现偶发超时或死锁

typeof(MyClass) 锁在 .NET Core / .NET 5+ 中是否更危险

是的。.NET Core 引入了 AssemblyLoadContext,同一个程序集可能被加载多次(例如插件场景、动态编译)。此时 typeof(MyClass) 在不同上下文中返回的 Type 对象**不相等**,但开发者通常意识不到这点 —— 表面看是“同一个类”,实际锁根本不同,导致本该串行的逻辑变成竞态;或者反过来,误以为安全而没加锁,结果出错。

更隐蔽的问题是:IL 编译器或 AOT(如 NativeAOT)可能对 typeof 做优化,进一步加剧行为不一致。

替代方案:安全又清晰的写法

用显式声明的静态锁对象,确保作用域唯一、意图明确:

Bardeen AI
Bardeen AI

使用AI自动执行人工任务

下载
public class MyClass
{
    private static readonly object _syncRoot = new();
public void DoWork()
{
    lock (_syncRoot)
    {
        // 安全的临界区
    }
}

}

如果需要细粒度控制(如按 ID 锁不同资源),改用 ConcurrentDictionary + GetOrAdd,避免锁爆炸:

private static readonly ConcurrentDictionary _perKeyLocks 
    = new();

public void DoWorkFor(string key) { var lockObj = perKeyLocks.GetOrAdd(key, => new object()); lock (lockObj) { // 按 key 隔离,不干扰其他 key } }

绝对不要依赖 Typestring 字面量(如 lock("MyClass"))、或任何可能被外部代码复用的引用对象作锁目标。

真正麻烦的从来不是“要不要加锁”,而是“锁的边界是否恰好覆盖你要保护的资源,且不超出”。typeof(MyClass) 的边界是不可控的全局,这在现代分层、插件化、测试并行的 C# 工程里,基本等于埋雷。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

668

2023.08.02

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

409

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

586

2023.08.10

JavaScript中的typeof用法
JavaScript中的typeof用法

在JavaScript中,typeof是一个用来确定给定变量的数据类型的操作符。可以用来确定一个变量是字符串、数字、布尔值、函数、对象或undefined的数据类型。更多关于typeof用法相关文章,详情请看本专题下面的文章,php中文网欢迎大家前来学习。

760

2023.11.23

包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法
包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法

本专题汇总了包子漫画官网和网页版入口,提供最新章节抢先看方法、正版免费阅读指南,以及稳定访问方式,帮助用户快速直达包子漫画页面,无广告畅享全集漫画内容。

44

2026.02.10

MC.JS网页版快速畅玩指南_MC.JS官网在线入口及免安装体验方法
MC.JS网页版快速畅玩指南_MC.JS官网在线入口及免安装体验方法

本专题汇总了MC.JS官网入口和网页版快速畅玩方法,提供免安装访问、不同版本(1.8.8、1.12.8)在线体验指南,以及正版网页端操作说明,帮助玩家轻松进入MC.JS世界,实现即时畅玩与高效体验。

29

2026.02.10

谷歌邮箱网页版登录与注册全指南_Gmail账号快速访问与安全操作教程
谷歌邮箱网页版登录与注册全指南_Gmail账号快速访问与安全操作教程

本专题汇总了谷歌邮箱网页版的最新登录入口和注册方法,详细提供官方账号快速访问方式、网页版操作教程及安全登录技巧,帮助用户轻松管理Gmail邮箱账户,实现高效、安全的邮箱使用体验。

25

2026.02.10

铁路12306订票与退改全攻略_高效购票与座位选取技巧
铁路12306订票与退改全攻略_高效购票与座位选取技巧

本专题全面汇总铁路12306订票、退票、改签及候补订单操作技巧,提供车厢座位分布参考、抢票攻略和高铁安检注意事项,帮助新手用户快速掌握高效购票与退改流程,提高出行效率和体验。

22

2026.02.10

TensorFlow2深度学习模型实战与优化
TensorFlow2深度学习模型实战与优化

本专题面向 AI 与数据科学开发者,系统讲解 TensorFlow 2 框架下深度学习模型的构建、训练、调优与部署。内容包括神经网络基础、卷积神经网络、循环神经网络、优化算法及模型性能提升技巧。通过实战项目演示,帮助开发者掌握从模型设计到上线的完整流程。

0

2026.02.10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9万人学习

C 教程
C 教程

共75课时 | 4.6万人学习

C++教程
C++教程

共115课时 | 16.9万人学习

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

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