C#中的lock锁
lock锁详解一、先解释lock是什么lock是 C# 中用于多线程同步的关键字它保证同一时刻只有一个线程能进入被锁住的代码块。lock(锁对象){// 临界区同一时刻只允许一个线程执行这里}核心概念概念说明锁对象lock括号里的对象作为门锁的标识临界区被lock包裹的代码块需要互斥保护的代码互斥一个线程进入后其他线程必须等待直到它退出执行流程否是线程1 到达 lock锁是否被占用?线程1 获取锁, 进入临界区线程1 执行临界区代码线程1 释放锁线程2 获取锁, 进入线程2 阻塞等待二、为什么需要锁问题背景多线程并发访问共享数据时会产生竞态条件Race Condition导致数据不一致。通用示例 1银行账户并发取款经典问题classBankAccount{privateint_balance1000;// 没有锁两个线程同时取款会出问题publicvoidWithdraw(intamount){if(_balanceamount)// ① 检查余额{Thread.Sleep(10);// 模拟耗时放大竞态窗口_balance-amount;// ② 扣款}}}问题线程 A 和线程 B 同时取 800 元A 执行①_balance1000 800✅B 执行①_balance1000 800✅还没被 A 扣A 执行②_balance 200B 执行②_balance 200错误应该扣两次变 -600或第二次失败加锁修复classBankAccount{privatereadonlyobject_locknew();privateint_balance1000;publicvoidWithdraw(intamount){lock(_lock)// 同一时刻只有一个线程能进来{if(_balanceamount){Thread.Sleep(10);_balance-amount;}}}}现在 A 和 B 会排队执行A 先扣完余额 200B 再检查发现200 800拒绝取款。✅通用示例 2多线程累加计数器intcounter0;vartasksnewListTask();// 1000 个任务同时 counterfor(inti0;i1000;i){tasks.Add(Task.Run(()counter));}Task.WaitAll(tasks.ToArray());Console.WriteLine(counter);// 结果可能不是 1000(竞态导致丢失更新)counter实际是三步读值 → 加一 → 写回。多线程并发时两个线程可能同时读到同一个值各自加一写回导致只加了一次。加锁修复objectlockObjnew();intcounter0;for(inti0;i1000;i){tasks.Add(Task.Run((){lock(lockObj){counter;}// 串行化保证结果 1000}));}三、lock的语法细节lock(lockObject){// 临界区}等价于编译器展开Monitor.Enter(lockObject);try{// 临界区}finally{Monitor.Exit(lockObject);// 无论是否异常都释放锁}关键点lock会自动处理异常情况finally保证释放锁不会死锁在异常上。锁对象必须是引用类型object、string等不能是值类型。锁对象通常用private readonly object声明不对外暴露。四、lock的注意事项与最佳实践锁对象要私有不要用lock(this)或lock(typeof(类))外部可能拿到同一对象造成意外阻塞。锁粒度要小只锁真正需要保护的代码不要在锁内做耗时操作如文件 IO、网络请求。不要在锁内调用外部回调可能死锁。lock不是万能的它只保护代码块不保护数据。所有访问共享数据的代码都必须用同一把锁。替代方案ConcurrentDictionary、Interlocked、ReaderWriterLockSlim等按需选择。七、总结lock 多线程互斥锁保证同一时刻只有一个线程进入临界区防止竞态条件。锁分离设计让业务与日志互不阻塞提高并发度。事件广播放在锁外避免持锁调用外部回调导致死锁。

相关新闻

C++学习笔记(聊天服务器)

C++学习笔记(聊天服务器)

虚函数 虚函数 给基类留一个 “接口空位”,让子类可以替换掉这个函数的实现;调用的时候,自动跑子类的代码,而不是基类的。这个行为叫多态。 如果不加virtual:调用哪个函数,看指针 / 引用的类型&#xff0c…

2026/8/26 18:44:22 阅读更多 →
控制 SELinux 文件上下文

控制 SELinux 文件上下文

初始 SELinux 上下文所有资源(如进程、文件和端口)都标有 SELinux 上下文。SELinux 在 /etc/selinux/targeted/contexts/files/ 目录中维护基于文件的文件标签策略数据库。新文件在文件名与现有标签策略匹配时获得默认标签。当新文件的名称与现有标签策略…

2026/8/26 18:44:22 阅读更多 →
MoonBit v0.10.9 版本更新

MoonBit v0.10.9 版本更新

MoonBit v0.10.4版本更新 对应moonc版本: v0.10.9 语言更新with-pattern 现在需要在使用了 with 的分支显示加上括号,便于读者更容易理解 with-pattern 的优先级。可以使用 moon fmt 进行自动迁移: fn main {let a Some("hello")match a {Som…

2026/8/26 18:44:21 阅读更多 →

最新新闻

新能源车辆车型大全API:从品牌列表到车型配置

新能源车辆车型大全API:从品牌列表到车型配置

一、车型数据的层级结构汽车数据天然是一个树状结构:品牌(Brand) └── 车系(Series) └── 具体车型(Model) └── 配置详情(Spec)车型库接口通常按照这个层级结构设…

2026/8/26 19:19:14 阅读更多 →
DMHS_VERI数据比对工具

DMHS_VERI数据比对工具

DMHS_VERI数据比对工具 一、概述 DMVERI主要实现功能在进行数据库数据的实时同步的时候,需要了解同步的结果是否 正确,因此需要有数据对比工具进行数据的对比,并生成详细的对比报告,提供用户参考。 达梦数据比对工具VERI产品随同“…

2026/8/26 19:19:14 阅读更多 →
骏成科技(301106)深度研究报告

骏成科技(301106)深度研究报告

一、投资要点 1.1 核心结论 骏成科技(301106.SZ)是国内中小尺寸液晶显示领域的专业制造商,深耕定制化液晶显示器件及显示模组,产品广泛应用于车载电子、工业控制、智能家居、医疗设备等专业显示领域。公司凭借多年积累的定制化研…

2026/8/26 19:19:14 阅读更多 →
江河集团(601886)深度研究报告

江河集团(601886)深度研究报告

一、投资要点1.1 核心结论江河集团(601886.SH)是国内建筑装饰行业的龙头企业,主营业务涵盖建筑幕墙、室内装饰以及光伏建筑一体化(BIPV)三大板块。公司以高端幕墙工程为核心,长期服务于大型公共建筑与商业地…

2026/8/26 19:19:14 阅读更多 →
AI + Cloud 双证优惠来了!半价通过AIF,免费考CPE!

AI + Cloud 双证优惠来了!半价通过AIF,免费考CPE!

你是否也在思考:AI时代,我该如何快速建立竞争力? 好消息!亚马逊现推出 AI Cloud 认证优惠计划,让你用最低 50 美金成本,拿下两张含金量超高的国际认证! 🎯 活动亮点 &#x1f525…

2026/8/26 19:19:14 阅读更多 →
可白嫖源码---课程设计--毕业设计--django药饮个性化推荐系统[编号:project54839](案件分析)

可白嫖源码---课程设计--毕业设计--django药饮个性化推荐系统[编号:project54839](案件分析)

本文仅展示核心实现逻辑与部分代码片段,完整项目源码、配套文档、数据库脚本内容较多,篇幅有限无法全部放出。 有需要完整资源的同学,可以在评论区留言【资料或领源码】,我会一 一回复站内私信,发送完整文件 摘 要 中…

2026/8/26 19:18:14 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/26 14:45:33 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/26 17:46:43 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/26 14:46:37 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/26 17:46:39 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →