c# - 实例构造函数中的 lock()

标签 c# multithreading constructor

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

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

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

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

编辑: 在这个问题的第一个答案C# Am i using lock correctly我找到了

It's best to put a lock around the code within the constructor, as I believe it's possible in certain circumstances that methods can be called before the constructor block has finished executing.

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

最佳答案

你完全正确,lock 完全没用,因为它锁定在一个实例变量上,而任何外部调用者都无法访问它。

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

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

关于c# - 实例构造函数中的 lock(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42133578/

相关文章:

c# - 如何使用 C# 在 Windows 上存储和检索凭据

c - 如何停止C process.h中的特定线程?

C# 手动锁定/解锁

c++ - 我定义了一个非拷贝构造函数;复制构造函数是否仍会被隐式定义?

c++ char * 在构造函数中初始化

c++ - 在 C++ 的构造函数 foo<T>() 中有一个模板是什么意思?

c# - 使用 WMI 在远程计算机中执行进程

c# - Htmlagilitypack - 获取文本内的所有文本+链接

c# - 在用户生成的文件名中使用 GUID 是个好主意吗?

android - 获取线程导致 Android 的另一个 Activity