lock关键字的使用
最近在代码中,发现别人使用了lock关键字,为了理解别人写的代码,所以自己对lock关键字的使用研究了下。
微软官方解释,请百度:lock 语句(C# 参考)
微软给了个官网实例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Account { decimal balance; private Object thisLock = new Object(); public void Withdraw( decimal amount) { lock (thisLock) { if (amount > balance) { throw new Exception( "Insufficient funds" ); } balance -= amount; } } } |
同时列出了几种错误的,或者说可能出问题的用法,需要注意!
列出微软的备注:
----------------------------------------------
lock
关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。 如果其他线程尝试进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。
线程 这节讨论了线程处理。
lock
关键字在块的开始处调用 Enter,而在块的结尾处调用 Exit。 ThreadInterruptedException 引发,如果 Interrupt 中断等待输入lock
语句的线程。
通常,应避免锁定 public
类型,否则实例将超出代码的控制范围。 常见的结构 lock (this)
、lock (typeof (MyType))
和 lock ("myLock")
违反此准则:
-
如果实例可以被公共访问,将出现
lock (this)
问题。 -
如果
MyType
可以被公共访问,将出现lock (typeof (MyType))
问题。 -
由于进程中使用同一字符串的任何其他代码都将共享同一个锁,所以出现
lock("myLock")
问题。
最佳做法是定义 private
对象来锁定, 或 private static
对象变量来保护所有实例所共有的数据。
在 lock
语句的正文不能使用 等待 关键字。
----------------------------------------------------
常见把lock对象定义为:private static readonly Object lockObj=new Object();
然后使用。
--2023-06-08 更新
把lock对象定义为:private static readonly Object lockObj 还是private readonly Object lockObj,需要根据你锁定的共享资源类型判断。
如果你的共享资源是基于实例的,你应该使用:private readonly Object lockObj,以减少锁定,影响的范围;
如果你的共享资源是全局静态对象,你应该使用:private static readonly Object lockObj,以确保你的锁定是起效的;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!