gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:15:21 26 4
gpt4 key购买 nike

我正在阅读 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) 之间确实存在一些区别,那么请帮助我理解所有要点的区别。具体来说,每个究竟是什么意思?

最佳答案

不同之处在于 lock 如果使用不当,可能会导致线程死锁。如果您不知道锁定目标的可见性(即,您不能 100% 确定谁拥有对目标的引用以及他们是否/何时可以锁定它),那么您无法真正知道应用程序是否可能会遇到死锁。

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

当然,在大多数情况下,所有这些都是纯粹的学术差异(通常人们不会四处寻找随机对象),但这是一种很好的防御性编码实践。

您链接到的页面状态:

In general, avoid locking on a public type, or instances beyond your code's control. The common constructs lock (this), lock (typeof (MyType)), and lock ("myLock") violate this guideline:

lock (this) is a problem if the instance can be accessed publicly.

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

lock (typeof (MyType)) is a problem if MyType is publicly accessible.

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

lock("myLock") is a problem because any other code in the process using the same string, will share the same lock.

另一种变体:由于字符串驻留,代码最终会尝试锁定同一个实例。

Best practice is to define a private object to lock on, or a private static object variable to protect data common to all instances.

关于c# - lock(this) 和 lock(thisLock) 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6815332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com