MSDN 在C#中给出了关于lock关键字的以下警告:
通常,避免锁定公共类型或超出代码控制范围的实例.常见的构造锁(this),lock(typeof(MyType))和lock("myLock")违反了这个指南:
Run Code Online (Sandbox Code Playgroud)* lock (this) is a problem if the instance can be accessed publicly. * lock (typeof (MyType)) is a problem if MyType is publicly accessible.
然而,它没有为它提供任何可靠的推理.锁(这个)在这里解释了SO.我对lock(typeof(MyType))案件感兴趣.有什么危险吗?
谢谢.
我读过几篇文章和帖子是说lock(this),lock(typeof(MyType)),lock("a string")都是不好的做法,因为另一个线程可以锁定相同的密钥和导致死锁.为了理解这个问题,我试图创建一些示例代码来说明死锁,但一直无法解决这个问题.
有人可以编写一个简洁的代码来说明这个经典问题吗?请保持简短,我只能在较小的块中消化代码.
编辑: 我认为lassevk总结得很好; 真正的问题是你失去了对锁的控制.一旦发生这种情况,您无法控制锁被调用的顺序,并且您允许潜在的死锁情况.
lock(this),lock(typeof(MyType))等所有的情况下,你选择了一个锁是无法控制的情况.
我有时会看到人们锁定局部变量.
这段代码坏了吗?
public void Do()
{
object o = new Object();
lock (o)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
我认为object o = new Object();应该在方法之外作为一个Field.
由于每个线程都获得了一个新实例o,因此会有多个锁.
我在这里错过了什么?在这种特定情况下,它不应该锁定字段吗?