C#锁对象是否需要延迟初始化

Does C# lock object require lazy initialization

我可能在某处遗漏了一些非常明显的文档,但是是否保证静态只读成员变量被正确初始化以用作锁对象?

简而言之,我有一个库 class,它对外部资源执行操作,任何时候应该只有一个实例接触它(不必担心另一个进程,它只是在单个进程上)。库class本身可以在多线程中有多个实例,所以为了保证一次只有一个实例访问该资源,我需要使用锁。

我见过很多这样的锁对象声明。

private static readonly object _lockObj = new object();

这能保证多个线程不会因为时机不对同时初始化两个对象并锁定两个对象吗?或者我应该像这样创建锁定对象。

private static readonly Lazy<object> _lockObj = new Lazy<object>(() => new object());

P.S。我指的是 C# 的 lock(_lockObj){...} 关键字用于锁定。

运行时保证静态成员字段只有一份。您甚至可以在没有 class 的任何实例的情况下使用它。用作锁定对象是安全的。