[英]ASP.NET MVC Race Condition? Factory Singleton Static Dictionary
我有以下單例類,用作在Web應用程序中創建對象的工廠。 但是,我發現在負載測試期間遇到了某種競爭狀況。 我應該遵循更好的模式嗎?
public class SearchProviderFactory {
private static SearchProviderFactory factory = null;
private static Dictionary<string, Type> providerMap = new Dictionary<string, Type>();
private SearchProviderFactory() {
// Error on the line below
providerMap.Add("company_name", Type.GetType("MyApp.CompanySearchProvider"));
providerMap.Add("job_title", Type.GetType("MyApp.JobTitleSearchProvider"));
}
public static SearchProviderFactory Instance {
get {
if (factory == null) {
factory = new SearchProviderFactory();
}
return factory;
}
}
}
我收到以下錯誤,即使似乎私有構造函數不應被多次調用。
System.ArgumentException: An item with the same key has already been added.
at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
at MyApp.SearchProviderFactory..ctor() in c:\MyApp\_scm\app\src\trunk\MyApp\SearchProviderFactory.cs:line 7
您的代碼與MSDN文章上討論C#中Singleton實現的示例代碼幾乎相同。 那篇文章很好,我推薦。
他們的建議是使用an添加一個lock()語句以實現關鍵部分。 在您的代碼中,將類似於:
public class SearchProviderFactory {
private static volatile SearchProviderFactory factory;
private static Dictionary<string, Type> providerMap = new Dictionary<string, Type>();
private SearchProviderFactory() {
// Error on the line below
providerMap.Add("company_name", Type.GetType("MyApp.CompanySearchProvider"));
providerMap.Add("job_title", Type.GetType("MyApp.JobTitleSearchProvider"));
}
public static SearchProviderFactory Instance {
get {
if (factory == null) {
lock (providerMap)
{
if (factory == null) {
factory = new SearchProviderFactory();
}
}
}
return factory;
}
}
}
我沒有編譯這段代碼,更不用說對其進行壓力測試了。 如果您嘗試過,請告訴我是否可行!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.