C#使用惰性初始化和锁在一起
我想要初始化一些对象,如:C#使用惰性初始化和锁在一起,c#,multithreading,lazy-initialization,C#,Multithreading,Lazy Initialization,我想要初始化一些对象,如: private static Lazy<MappingEngine> engine = new Lazy<MappingEngine>(() => { return new MappingEngine(); }) 用法: private static MyLazyType<MappingEngine> engine = new MyLazyType<MappingEngine>(() => {
private static Lazy<MappingEngine> engine = new Lazy<MappingEngine>(() =>
{
return new MappingEngine();
})
用法:
private static MyLazyType<MappingEngine> engine = new MyLazyType<MappingEngine>(() =>
{
return new MappingEngine();
})
私有静态MyLazyType引擎=新的MyLazyType(()=>
{
返回新的映射引擎();
})
你的专业化懒惰
没有额外的好处。强调的问题如下:
var t1 = new Thread(()=>{
myLazy.Value.SomeNonThreadsafeMethod();
});
var t2 = new Thread(()=>{
myLazy.Value.SomeNonThreadsafeMethod();
});
t1.Start();
t2.Start();
显然,在您获得值后,lazy在其操作中不再扮演任何角色,如果要跨多个线程使用该值,则需要在其方法和属性中编写额外的保护。如果在访问myLazy.value时设置锁(就像我在MyLazyType中所做的那样),这难道不能保证所有SomeNonThreadsafeMethod调用都是安全的吗?@sotn不,因为在调用
SomeNonThreadsafeMethod
时,我们已经不在锁的范围内了。谢谢
var t1 = new Thread(()=>{
myLazy.Value.SomeNonThreadsafeMethod();
});
var t2 = new Thread(()=>{
myLazy.Value.SomeNonThreadsafeMethod();
});
t1.Start();
t2.Start();