【发布时间】:2015-10-20 11:30:48
【问题描述】:
我希望我的一些对象被延迟初始化,例如:
private static Lazy<MappingEngine> engine = new Lazy<MappingEngine>(() =>
{
return new MappingEngine();
})
而且我不希望多个线程在初始化后访问该对象。我是否也应该使用锁定机制来防止这种情况,或者 Lazy 是否以这种方式支持线程安全?同时使用 Lazy 和 lock 似乎不是正确的做法。
在docs 中声明“使延迟对象线程安全并不能保护延迟初始化的对象。如果多个线程可以访问延迟初始化的对象,则必须使其属性和方法对多线程访问安全.”
编写一个自定义类型,它是一种惰性类型,并且每次都锁定engine.Value 被称为合乎逻辑的事情吗?举个例子:
public class MyLazyType<T> : Lazy<T>
{
private object lockObj = new object(); //not static since the reference to this class will be
public MyLazyType(Func<T> valueFactory) : base(valueFactory)
{
}
public new T Value
{
get
{
lock (lockObj)
{
return base.Value;
}
}
}
}
用法:
private static MyLazyType<MappingEngine> engine = new MyLazyType<MappingEngine>(() =>
{
return new MappingEngine();
})
【问题讨论】:
标签: c# multithreading lazy-initialization