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

时间:2016-05-05 22:26:22

标签: c# multithreading lazy-initialization

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

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

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

private static readonly object _lockObj = new object();

这可以保证多个线程不会在错误的时间内同时初始化两个对象并锁定两个对象吗?或者我应该像这样创建锁定对象。

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

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

1 个答案:

答案 0 :(得分:2)

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