Lock() 在实例构造函数中



我在实例构造函数中的一些代码锁语句中找到了。代码如下所示

public class MyClass
{
    private readonly object _syncRoot = new object();
    public MyClass(string parameter)
    {
        lock (_syncRoot)
        {
            // some code
        }
    }
}

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

编辑:在这个问题的第一个答案中 C# 我是否正确使用锁我发现

最好在构造函数中的代码周围放置一个锁,因为我 相信在某些情况下,方法可能是 在构造函数块完成执行之前调用。

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

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

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

编辑:(回应Sinatr的评论(上面对关键部分中的代码进行了假设,即它不会进行使用_syncRoot对象进行锁定的方法调用。如果存在此类方法调用,则将授予其关键部分访问权限,因为线程已包含监视器。

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

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

除了内存障碍情况之外,最合理的原因是,有一个规则"始终在锁中处理这些字段"在其他成员中是有意义的,而编码人员没有意识到这是一个例外。

最新更新