实例构造函数中的lock()

时间:2017-02-09 10:03:26

标签: c# multithreading constructor

我在实例构造函数中找到了一些代码锁语句。代码看起来像这样

public class MyClass
{
    private readonly object _syncRoot = new object();

    public MyClass(string parameter)
    {
        lock (_syncRoot)
        {
            // some code
        }
    }
}

我认为锁在这里没用,因为这个代码不能在不同的线程中调用。每个线程都将创建自己的对象实例调用构造函数。但也许我错了,不知道什么。感谢。

修改 在这个问题的第一个答案中C# Am i using lock correctly我找到了

  

最好在构造函数中围绕代码锁定,就像我一样   相信在某些情况下可以使用方法   在构造函数块完成执行之前调用。

所以,这可能是一个答案。

2 个答案:

答案 0 :(得分:8)

是的,如果它不是静态字段,那几乎肯定没用。

可以用于强制内存屏障,如果锁内的任何内容需要它。更有可能的是它过度使用(不会产生任何影响)或使用不足(应该有锁,但它应该在静态字段上)。

在记忆障碍案例之外,最合理的理由是,有一个规则是“始终在锁定中处理这些字段”。这在其他成员中是有意义的,编码器并没有意识到这是一个例外。

答案 1 :(得分:6)

你是绝对正确的,lock完全没用,因为它锁定了一个实例变量,而无论外部调用者都无法访问它。

我认为如果_syncRoot被声明为static,此代码将变得有用,在这种情况下,受锁保护的关键部分的语义将从每个实例更改为每个实例一个-class。

编辑:(响应Sinatr的评论)上面对关键部分内部的代码做了一个假设,它没有使用_syncRoot对象进行锁定的方法调用同样。如果有这样的方法调用,它们的关键部分将被授予访问权限,因为该线程已经拥有监视器。