惰性初始化对象的线程安全处理

时间:2018-06-19 19:15:04

标签: c# .net thread-safety

在C#中处置延迟初始化的对象的线程安全方法是什么?假设我具有以下Lazy构造:

Lazy<MyClass> lazy = new Lazy<MyClass>(() => MyClass.Create(), true);

稍后,我可能想处置创建的MyClass实例。现有的大多数解决方案都建议采用以下方式:

if (lazy.IsValueCreated)
{
    lazy.Value.Dispose();
}

但是据我所知IsValueCreated没有任何锁:https://referencesource.microsoft.com/#mscorlib/system/Lazy.cs,284

这意味着当我们检查MyClass时,另一个线程可能正在初始化IsValueCreated。在这种情况下,我们将观察到IsValueCreated为假,最终导致资源泄漏。正确的做法是什么?还是我错过了一些细微的细节?

0 个答案:

没有答案