lock关键字的使用
最近在代码中,发现别人使用了lock关键字,为了理解别人写的代码,所以自己对lock关键字的使用研究了下。
微软官方解释,请百度:lock 语句(C# 参考)
微软给了个官网实例代码:
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,以确保你的锁定是起效的;
 
                     
                    
                 
                    
                 
                
            
         
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号