Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#使用惰性初始化和锁在一起_C#_Multithreading_Lazy Initialization - Fatal编程技术网

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();