锁定声明

使用 lock 语句,你可以控制不同线程对代码块内代码的访问。它通常用于防止竞争条件,例如多个线程从集合中读取和删除项目。由于锁定强制线程等待其他线程退出代码块,因此可能导致其他同步方法可以解决的延迟。

MSDN

lock 关键字通过获取给定对象的互斥锁,执行语句,然后释放锁来将语句块标记为关键部分。

lock 关键字确保一个线程不进入代码的关键部分,而另一个线程处于临界区。如果另一个线程试图输入锁定的代码,它将等待,阻止,直到该对象被释放。

最佳做法是定义要锁定的私有对象,或私有静态对象变量以保护所有实例共有的数据。

在 C#5.0 及更高版本中,lock 语句相当于:

bool lockTaken = false;
try 
{
    System.Threading.Monitor.Enter(refObject, ref lockTaken);
    // code 
}
finally 
{
    if (lockTaken)
        System.Threading.Monitor.Exit(refObject);
}

对于 C#4.0 及更早版本,lock 语句相当于:

System.Threading.Monitor.Enter(refObject);
try 
{
    // code
}
finally 
{
     System.Threading.Monitor.Exit(refObject);
}