考慮下面的代碼:此圖案的名稱? (答案:延遲初始化有雙重檢查鎖定)
public class Foo
{
private static object _lock = new object();
public void NameDoesNotMatter()
{
if(SomeDataDoesNotExist())
{
lock(_lock)
{
if(SomeDataDoesNotExist())
{
CreateSomeData();
}
else
{
// someone else also noticed the lack of data. We
// both contended for the lock. The other guy won
// and created the data, so we no longer need to.
// But once he got out of the lock, we got in.
// There's nothing left to do.
}
}
}
}
private bool SomeDataDoesNotExist()
{
// Note - this method must be thread-safe.
throw new NotImplementedException();
}
private bool CreateSomeData()
{
// Note - This shouldn't need to be thread-safe
throw new NotImplementedException();
}
}
首先,有一些假設,我需要狀態:
有一個很好的理由我不能一旦創建應用程序,就不要這樣做。也許數據還沒有提供等等。
Foo可以被實例化,並且可以從兩個或多個線程同時使用。我希望其中一個最終創建一些數據(但不是兩個),然後我將允許兩個訪問相同的數據(忽略訪問數據的線程安全)
SomeDataDoesNotExist()的成本是不是很大。
現在,這不一定侷限於某些數據創建情況,但這是我能想到的一個例子。
我特別感興趣的是識別模式的部分是check - > lock - > check。我不得不多次向開發者解釋這種模式,他們一開始並沒有得到算法,但可以欣賞它。
無論如何,其他人必須做類似的事情。這是一種標準化模式嗎?它叫什麼?
看起來像一個奇怪的方式來利用同步,[懶惰加載](http://en.wikipedia.org/wiki/Lazy_loading),[單身模式](http://en.wikipedia.org/wiki/Singleton_pattern)給我。 – 2011-05-15 20:39:17
你在暗示可能有更好但功能相同的方法來做到這一點。你有什麼特別的想法? – 2011-05-15 20:42:27
我說的很奇怪,因爲它將許多模式組合成一種方法。通常我會希望看到他們在單獨的方法。即延遲加載的單例(數據)將在單獨的方法/屬性中。 – 2011-05-15 20:45:46