lock(this)和lock(thisLock)的区别是什么?

本文关键字:lock 是什么 区别 this thisLock | 更新日期: 2023-09-27 18:03:40

我正在阅读锁语句(c#参考),我看到了这段代码:

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

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

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

lock(this)和lock(thisLock)的区别是什么?

差异源于lock如果使用不当,可能导致线程死锁。如果锁目标的可见性对您来说是未知的(例如,您不能100%确定谁有对目标的引用,以及他们是否/何时可能lock它),那么您就不能真正知道应用程序是否可能遇到死锁。

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

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

链接到的页面:

一般来说,避免锁定公共类型或超出您的代码的控制。常见的构造是lock (this), lock (typeof)(MyType))和lock ("myLock")违反了这个准则:

如果实例可以被公开访问,

lock (this)是一个问题。

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

如果MyType是可公开访问的,

lock (typeof (MyType))是有问题的。

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

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

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

最佳实践是定义一个要锁定的私有对象,或者一个私有的静态对象变量,用于保护所有实例共有的数据。

当你做lock(this)你没有完全控制this,因为你不知道谁会使用this或你的类的实例。使用局部对象是安全的,因为局部对象只在你的类中可用,因此你可以完全控制它

查看详细信息