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

Naw*_*waz 8 c# multithreading locking

我正在读锁定语句(C#参考),在那里我看到了这段代码:

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

    //...

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

    //...
}
Run Code Online (Sandbox Code Playgroud)

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

如果您认为lock(this)和之间确实存在一些差异lock(thisLock),那么请帮助我理解所有重点之间的差异.特别是,每个人究竟意味着什么?

Jon*_*Jon 14

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

出于这个原因,这是习惯性地锁定在private成员:因为它是私有的,它是在你的代码,你知道,没有人还能lock它.

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

您链接到州的页面:

通常,避免锁定公共类型或超出代码控制范围的实例.常见的构造锁(this),lock(typeof(MyType))和lock("myLock")违反了这个指南:

如果可以公开访问实例,则锁定(this)是一个问题.

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

如果MyType可公开访问,则lock(typeof(MyType))是一个问题.

上面的变体,如果类型对其他代码可见,那么您可能最终尝试锁定与该代码相同的实例(typeof返回单例实例).

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

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

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