- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在阅读 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/
我正在阅读 lock Statement (C# Reference)我在哪里看到这段代码: class Account { private Object thisLock = new Obj
我是一名优秀的程序员,十分优秀!