我在实例构造函数中找到了一些代码锁语句。代码看起来像这样
public class MyClass
{
private readonly object _syncRoot = new object();
public MyClass(string parameter)
{
lock (_syncRoot)
{
// some code
}
}
}
我认为锁在这里没用,因为这个代码不能在不同的线程中调用。每个线程都将创建自己的对象实例调用构造函数。但也许我错了,不知道什么。感谢。
修改 在这个问题的第一个答案中C# Am i using lock correctly我找到了
最好在构造函数中围绕代码锁定,就像我一样 相信在某些情况下可以使用方法 在构造函数块完成执行之前调用。
所以,这可能是一个答案。
答案 0 :(得分:8)
是的,如果它不是静态字段,那几乎肯定没用。
可以用于强制内存屏障,如果锁内的任何内容需要它。更有可能的是它过度使用(不会产生任何影响)或使用不足(应该有锁,但它应该在静态字段上)。
在记忆障碍案例之外,最合理的理由是,有一个规则是“始终在锁定中处理这些字段”。这在其他成员中是有意义的,编码器并没有意识到这是一个例外。
答案 1 :(得分:6)
你是绝对正确的,lock
完全没用,因为它锁定了一个实例变量,而无论外部调用者都无法访问它。
我认为如果_syncRoot
被声明为static
,此代码将变得有用,在这种情况下,受锁保护的关键部分的语义将从每个实例更改为每个实例一个-class。
编辑:(响应Sinatr的评论)上面对关键部分内部的代码做了一个假设,它没有使用_syncRoot
对象进行锁定的方法调用同样。如果有这样的方法调用,它们的关键部分将被授予访问权限,因为该线程已经拥有监视器。