C# 锁(这个)和锁(这个锁)有什么区别?
我正在阅读我在哪里看到的代码:C# 锁(这个)和锁(这个锁)有什么区别?,c#,multithreading,locking,C#,Multithreading,Locking,我正在阅读我在哪里看到的代码: class Account { private Object thisLock = new Object(); //... int Withdraw(int amount) { lock (thisLock) { //.... } } //... } 我想知道如果我们在上面的例子中写lock(this)而不是lock(thisLock),是
class Account
{
private Object thisLock = new Object();
//...
int Withdraw(int amount)
{
lock (thisLock)
{
//....
}
}
//...
}
我想知道如果我们在上面的例子中写lock(this)
而不是lock(thisLock)
,是否会有什么不同。请看看你的答案是否取决于它
如果您认为
lock(this)
和lock(thisLock)
之间确实存在一些差异,那么请帮助我理解所有要点的差异。具体来说,每种方法的确切含义是什么?这一区别源于这样一个事实,即锁
,如果使用不当,可能会导致线程死锁。如果您不知道锁定目标的可见性(即,您无法100%确定谁有对目标的引用,以及他们是否/何时可能lock
it),则您无法真正知道应用程序是否会遇到死锁
出于这个原因,通常会锁定private
成员:因为它是私有的,并且在您的代码中,所以您知道没有其他人可以锁定它
当然,这在大多数情况下纯粹是学术上的差异(通常人们不会到处锁定随机对象),但这是一种很好的防御性编码实践
您链接到的页面状态为:
一般情况下,避免锁定公共类型或超出您权限的实例
代码的控制。常见的构造有lock(this)、lock(typeof
(MyType)和锁(“myLock”)违反了本准则:
如果可以公开访问实例,则锁定(这)是一个问题
因为其他人可能会使用他们拥有的引用锁定实例,而您的锁定(this)
的代码当然不会期望这样。(见第26行)
如果MyType是可公开访问的,则锁(typeof(MyType))是一个问题
上述的一种变体,如果该类型对其他代码可见,那么您可能会尝试锁定与该代码相同的实例(typeof
返回单实例)
锁(“myLock”)是一个问题,因为进程中有任何其他代码
使用相同的字符串,将共享相同的锁
另一种变体:由于字符串的插入,代码最终试图锁定同一个实例
最佳实践是定义要锁定的私有对象或私有对象
静态对象变量,用于保护所有实例共用的数据
当您执行锁定(this)
时,您无法完全控制此
,因为您不知道还有谁会使用此
或您的类实例。使用局部对象是安全的,因为该局部对象仅在类中可用,因此您将对其拥有完全控制权
有关详细信息,请参见:我不理解这一点:而您的锁定代码(这一点)当然不会想到这一点。
为什么?怎么会导致死锁?@Nawaz:增加了一个例子。它是否清楚地说明了问题?我仍然不理解僵局。为什么在线程Y完成执行其已锁定的关键代码后,线程X不可能开始执行lock(this){}
内的代码?可能的重复