我正在阅读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)
之间确实存在一些差异,请帮助我理解所有要点之间的区别。特别是,每个完全意味着什么?
答案 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