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

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

class Account { private Object thisLock = new Object(); //... int Withdraw(int amount) { lock (thisLock) { //.... } } //... } 

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

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

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

出于这个原因,通常会锁定一个private成员:因为它是私有的并且在你的代码中,你知道没有其他人可以lock它。

当然,这一切大部分时间都是纯粹的学术差异(通常人们不会随意锁定随机对象),但这是一个很好的防御性编码练习。

您链接到的页面说明:

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

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

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

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

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

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

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

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

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

看到这个细节