最底層的類是快速,線程安全,「無鎖定」,懶惰初始化程序的實現。線程安全的懶惰初始化程序;交換Func <>是個好主意嗎?
我說「鎖定自由」,雖然它不完全;它在初始化之前使用一個鎖,然後替換該調用以獲取不使用該鎖的數據。 (類似於使用volatile成員的雙重檢查鎖;並且從性能測試中我得到v類似的結果。)
我的問題是;這是一件好事/安全的事情嗎?
(我寫了這個之後,我注意到,.NET 4.0有一個LazyInit<T>
執行相同的操作多,但在我創建了一個實現非常高的人爲的例子是稍快:-))
NB類已被修改爲包括Value
成員和揮發性的_get
class ThreadSafeInitializer<TOutput>
where TOutput : class
{
readonly object _sync = new object();
TOutput _output;
private volatile Func<TOutput> _get;
public TOutput Value { get { return _get(); } }
public ThreadSafeInitializer(Func<TOutput> create)
{
_get =() =>
{
lock (_sync)
{
if (_output == null)
{
_output = create();
_get =() => _output; // replace the Get method, so no longer need to lock
}
return _output;
}
};
}
}
+1,什麼不該做的一個非常聰明的例子 – 2009-09-24 01:19:15
嗯,我認爲這有點苛刻;儘管正如我承認的,從鎖中調用未知的代碼是一件壞事,但正如Sam在下面注意到的那樣,.NET 4.0框架附帶的是什麼...... – 2009-09-24 20:51:02