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,以确保你的锁定是起效的;

 

posted on   荆棘人  阅读(184)  评论(0编辑  收藏  举报

编辑推荐:
· 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代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示