Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 锁(这个)和锁(这个锁)有什么区别?_C#_Multithreading_Locking - Fatal编程技术网

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){}
内的代码?可能的重复