锁:lock、Monitor、SemaphoreSlim

news/2025/11/20 13:29:14/文章来源:https://www.cnblogs.com/ldl168/p/19246727

锁:lock、Monitor、SemaphoreSlim

Posted on 2025-11-20 13:26  懒得理  阅读(0)  评论(0)    收藏  举报

一、lock关键字是C#提供的一个语法糖,底层基于System.Threading.Monitor。用于确保同一时间只有一个线程可以执行某段代码(临界区)
✔ lock 的本质是什么?它是:Monitor.Enter() + try/finally + Monitor.Exit() 的语法糖
private readonly object _lockObj = new object();
lock (_lockObj)
{
// 临界区代码
}
特点:1、互斥性:只允许一个线程进入。2、自动释放:即使发生异常,也会通过finally块释放锁3、不可中断:无法设置超时或取消 4、不能跨进程:仅限于当前appdomain内部 5、性能好:适用于简单的互斥场景
✔ lock 适合什么时候用?
写共享变量
访问字典、列表、队列
文件写入
上位机中共享串口、TCP 数据解析的临界区

二、Monitor类
lock的底层实现就是调用Monitor.Enter/Monitor.exit
提供比lock更细颗度的控制,例如支持超时等待
bool lockTaken = false;
try
{
Monitor.TryEnter(_lockObj, TimeSpan.FromSeconds(1), ref lockTaken);
if (lockTaken)
{
// 临界区
}
}
finally
{
if (lockTaken)
Monitor.Exit(_lockObj);
}
特点:支持TryEnter设置超时,可以手动控制锁的获取与释放,仍为独占锁(一次只能一个线程持有),同样不能跨进程。
✔ Monitor 用于:
生产者/消费者队列
设备消息队列的阻塞式等待
通常在“通信线程 + UI 线程”模型下可能需要。

三、SemaphoreSlim
表示一个轻量级信号量。允许多个线程同时访问资源。但是数量受限制,适用于资源地、限流等场景。
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(3); // 最多3个并发
await _semaphore.WaitAsync(); // 异步等待(推荐)
try
{
// 最多3个线程可同时执行此处
}
finally
{
_semaphore.Release();
}
特点:
支持并发数>1(如数据库连接池最多5个连接)
支持异步等待(WaitAsync()),非常适合async/await场景
支持超时(Wait(TimeSpan) 或 WaitAsync(TimeSpan))
轻量级:相比Semaphore(基于内核对象),Semaphore是纯托管实现,性能更好
不能跨进程(若需跨进程,用 Semaphore 而非 SemaphoreSlim)
SemaphoreSlim 用于:
限制一次最多几条指令发送
限制一个设备一次只能处理 1 个 CRC 运算
控制同时运行的后台任务数量
调度异步 IO 任务

选择建议
如果只是保护一小段代码,确保线程安全 → 用 lock。
如果需要带超时的互斥锁 → 用 Monitor.TryEnter。
如果允许多个线程并发(但有限制),或在 async 方法中做同步 → 用 SemaphoreSlim。

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

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

相关文章

完整教程:ASP.NET MVC 前置基础:宿主环境 HttpRuntime 管道,从部署到流程拆透(附避坑指南)

完整教程:ASP.NET MVC 前置基础:宿主环境 & HttpRuntime 管道,从部署到流程拆透(附避坑指南)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: blo…

08_TCP服务器:一请求一线程 epoll

一. TCP的服务器基础部门, 网络编程 并发服务器: 1)一请求一线程 2)IO多路复用, epoll TCP服务器百万连接:将在 09_百万并发服务器进行介绍。二. 服务器:前台迎宾 --> listen; 服务员 --> clientfd 多个客户…

真正的宝藏都藏在小众软件里,这 6 个强到怀疑人生!

你有没有这种感觉: 电脑明明配置不错,但每天用起来就是不顺手—— 找文件慢、窗口乱、操作重复、不够高效、工具不贴心…… 很多人会以为是电脑问题,其实不是。 往往是你没遇到那些“真正的宝藏软件”。 不是那些大…

【Spring Boot 报错已解除】别让端口配置卡壳!Spring Boot “Binding to target failed” 报错解决思路

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

水质COD测定仪品牌厂家推荐:便携式COD测定仪/快速COD测定仪详解

在当今社会,随着环境保护意识的日益增强,水质监测成为了关乎生态健康与人类福祉的重要议题。化学需氧量(COD)作为衡量水体污染程度的关键指标之一,其准确测定对于评估水质状况、指导污水处理及保护水环境具有不可…

2025年11月托福一对一机构哪家强?名师定制/精准提分/个性化辅导机构推荐

2025年11月托福一对一机构哪家强?名师定制/精准提分/个性化辅导机构推荐随着留学申请竞争的日趋激烈,托福成绩作为核心申请指标,其提分需求呈现精细化、个性化趋势。托福一对一课程因能精准匹配学员基础、针对性解决…

【第7章 I/O编程与异常】Python异常捕获终极指南:哪些能拦、哪些拦不住?(通俗+深度双解析)

Python异常捕获终极指南:哪些能拦、哪些拦不住?(通俗+深度双解析) 在Python编程中,try-except 是保障程序健壮性的核心机制,就像给程序装了“智能安全盾”——能精准拦截预期内的错误,却挡不住底层逻辑漏洞或系…

STM32学习(MCU控制)(USART) - 指南

STM32学习(MCU控制)(USART) - 指南2025-11-20 13:05 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !…

DeepSeek-OCR本地部署教程:DeepSeek突破性开创上下文光学压缩,10倍效率重构文本处理范式 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

NET 8 使用 rabbitMQ

RabbitMQ.Client 7.2 推荐使用异步 var connection = factory.CreateConnection(); var channel = connection.CreateModel();//替换为下面 using var connection = await factory.CreateConnectionAsync(); using var…

2025最新托福机构清单:从基础到110+,5大品牌助你高效冲刺目标分

2025最新托福机构清单:从基础到110+,5大品牌助你高效冲刺目标分在托福备考的赛道上,选对培训机构往往能让复习效率翻倍。无论是追求基础夯实、高分突破,还是需要个性化定制方案,合适的机构都能提供精准助力。以下…

详细介绍:【基于Selenium的智能滑块验证码破解技术详解】

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

使用React如何静默打印页面:完整的前端打印解决专业的方案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025-11-20 Thursday docker默认占用的IP地址 修改

docker默认会占用一个ip地址,默认为 172.17.0.1/24 有时候可能会与局域网内的其他计算机的地址冲突,要修改 /etc/docker/daemon.json 如果文件不存在,直接添加 内容为: { "bip": "192.168.100.100/…

常见的ai工具

将录音转换为文本将音频或者视频文件转换文本音乐aisuno

AI编程:用 CodeBuddy 飞快构建本地 SQLite 记账本,小白也能轻松上手!

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

水波紋特效

Water Effectbody { margin: 0; padding: 0; overflow: hidden; background-color: rgba(0, 0, 0, 1) } canvas { display: block; width: 100%; height: 100% }喜欢的话,请点赞,转发、收藏、评论,谢谢!

《说苑敬慎》中的故事

《说苑敬慎》中的故事 孙叔敖担任楚国宰相时,全国官吏百姓纷纷前来祝贺。唯独有一位老人,身着粗布衣、头戴白冠,并不是来道喜,而是来“吊唁”。 孙叔敖整理衣冠迎接,问他:“楚王不知我无德,误让我做了宰相。人人…

任何事物,都是用工具逻辑和方法策略去证明,而不是指定被某个人和组织去证明

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891真理的证明权,在工具逻辑,不在任何主体。 这是最终解锁——不仅拒绝了还原论的外部验证,也拒绝了个人/组织的权威指定,将合法性锚定于工具逻辑的自我执行…

实用指南:[从零开始面试算法] (04/100) LeetCode 136. 只出现一次的数字:哈希表与位运算的巅峰对决

实用指南:[从零开始面试算法] (04/100) LeetCode 136. 只出现一次的数字:哈希表与位运算的巅峰对决2025-11-20 12:35 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal…