我在阅读微软关于Lazy< T>(bool)构造函数的文档时感到困惑。
该参数描述为:
isThreadSafe :true表示此实例可由多个线程同时使用; false以使实例一次只能由一个线程使用。
如果我通常在访问者中编写的代码是:
If _rulesCache Is Nothing Then
SyncLock (_lockRulesCache)
If _rulesCache Is Nothing Then
_rulesCache = New RulesCache()
End If
End SyncLock
End If
Return _rulesCache
我想在Lazy类型的构造函数中使用True还是False?
Private _rulesCache As New Lazy(Of RulesCache)(**?**)
所以我的访问者变成了:
Return _rulesCache.Value
1)创建对象后,它可以在内部处理多个线程访问。
2)我只需要确保如果有多个线程同时接近访问者并且该对象不存在,那么它只会被创建一次。
根据文档,声明1暗示参数应为false。声明2暗示参数应为true。
我觉得我过度思考这个问题,这让我更加困惑。或者上面的两个陈述实际上彼此不一致,我应该坚持使用手动锁定来管理对象实例化?
答案 0 :(得分:2)
陈述2是理想的解释。延迟初始化完成后,该参数不会影响对象的任何行为;它只能防止两个线程意外地竞争并将其实例化两次。如果你很好奇,可以在Reflector中验证。