// Member Variable
private static readonly object _syncLock = new object();
// Now inside a static method
foreach (var lazyObject in plugins)
{
if ((string)lazyObject.Metadata["key"] = "something")
{
lock (_syncLock)
{
// It seems the `IsValueCreated` is not up-to-date
if (!lazyObject.IsValueCreated)
lazyObject.value.DoSomething();
}
return lazyObject.value;
}
}
這裏我需要每個循環的同步訪問。有很多線程迭代這個循環,並且基於他們正在尋找的key
,創建並返回一個懶惰的實例。使用MEF的線程安全惰性實例化
lazyObject
不應該創建更多的一次。雖然Lazy
類是這樣做的,儘管使用了鎖,但在高線程下,我創建了不止一個實例(我通過volatile
static int
上的Interlocked.Increment
進行跟蹤並將其記錄在某處)。問題是我沒有訪問Lazy
的定義,而MEF
定義Lazy
類如何創建對象。我應該注意到CompositionContainer
在已經使用的構造函數中有一個線程安全選項。
我的問題:
1)爲什麼鎖不起作用?
2)我應該使用一組鎖而不是一個鎖來提高性能嗎?
自己是不是在該代碼(這使得它很難看你有沒有這個問題)完全正確。你有一個靜態成員函數訪問類的非靜態成員變量(它不會編譯) – 2011-01-08 12:09:46
當然這是靜態的。編輯。 – Xaqron 2011-01-08 12:25:00
嘗試將`return lazyObject.value`移動到鎖內。 – jgauffin 2011-01-08 13:40:30