lock(this)和lock(thisLock)有什么区别?

时间:2011-07-25 11:26:08

标签: c# multithreading locking

我正在阅读lock Statement (C# Reference),我看到了这段代码:

class Account
{
    private Object thisLock = new Object();

    //...

    int Withdraw(int amount)
    {
        lock (thisLock)
        {
           //....
        }
    }

    //...
}

我想知道如果我们在上面的例子中写lock(this)而不是lock(thisLock)会有什么不同。如果你的答案取决于它,请参阅the complete example

如果您认为lock(this)lock(thisLock)之间确实存在一些差异,请帮助我理解所有要点之间的区别。特别是,每个完全意味着什么?

2 个答案:

答案 0 :(得分:12)

差异源于lock如果被误用,可能导致线程死锁的事实。如果您不知道锁定目标的可见性(即,您不能100%确定谁有对目标的引用以及是否/何时可能lock),那么您无法确切知道应用程序是否可能遇到死锁。

出于这个原因,通常会锁定private成员:因为它是私有的并且在您的代码中,您 知道其他任何人都无法lock。< / p>

当然,所有这些在大多数时候都是纯粹的学术差异(通常人们不会随意锁定随机对象),但这是一种很好的防御性编码练习。

您链接到的状态:

  

一般情况下,避免锁定公共类型或超出您的实例   代码的控制。常见的构造锁定(this),锁定(typeof   (MyType))和lock(“myLock”)违反了这条准则:

     如果可以公开访问实例,则

lock(this)是一个问题。

因为其他人可能会使用他们拥有的引用来锁定实例,而lock(this)的代码当然不会期望这样。 Example on IDEone(见第26行)。

  如果MyType可公开访问,则

lock(typeof(MyType))是一个问题。

上述变体,如果其他代码可以看到该类型,那么您最终可能会尝试锁定与该代码相同的实例(typeof返回单例实例)。

  

lock(“myLock”)是一个问题,因为该过程中的任何其他代码   使用相同的字符串,将共享相同的锁。

另一种变化:由于字符串实习,代码最终试图锁定同一个实例。

  

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

答案 1 :(得分:2)

执行lock(this)时,您无法完全控制this因为您不知道还有谁会使用this或您班级的实例。使用本地对象是安全的,因为该本地对象只能在您的类中使用,因此您可以完全控制它

有关详细信息,请参阅this