【发布时间】:2012-07-19 07:20:17
【问题描述】:
readingLazyInitializer 之后是:
它提供了另一种具有多个线程的初始化模式 竞相初始化。
这是一个示例:
Expensive _expensive;
public Expensive Expensive
{
get // Implement double-checked locking
{
LazyInitializer.EnsureInitialized (ref _expensive,() => new Expensive());
return _expensive;
}
}
问题 #1
看:
为什么#A 说它实现了双重检查锁定?它只是一个获得财产?
问题 #2
#B(lambda 表达式)是线程安全的吗?
问题 #3
所以我通过查看样本搜索了这个“race-to-initialize”:
volatile Expensive _expensive;
public Expensive Expensive
{
get
{
if (_expensive == null)
{
var instance = new Expensive();
Interlocked.CompareExchange (ref _expensive, instance, null);
}
return _expensive;
}
}
然后我想:初始化的竞赛不是线程安全的吗?
e/g/ 如果有 2 个线程进入:
昂贵的对象将被创建两次!
再说一遍,3个问题
1)为什么#A 说它实现了双重检查锁定?它只是一个获得财产?
2)#B(lambda 表达式)是线程安全的吗?
3) 初始化竞争不是线程安全的
【问题讨论】:
-
评论“//实施...”听起来更像是对未来的计划,我想说
标签: c# .net multithreading .net-4.0