C# ASP.NET MVC竞赛条件?工厂单例静态字典
我有下面的singleton类,它充当在web应用程序中创建对象的工厂。然而,我看到在负载测试期间我得到了某种竞争条件。有没有更好的模式我应该遵循C# ASP.NET MVC竞赛条件?工厂单例静态字典,c#,singleton,factory,C#,Singleton,Factory,我有下面的singleton类,它充当在web应用程序中创建对象的工厂。然而,我看到在负载测试期间我得到了某种竞争条件。有没有更好的模式我应该遵循 public class SearchProviderFactory { private static SearchProviderFactory factory = null; private static Dictionary<string, Type> providerMap = new Dictio
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;
}
}
}
您的代码与C#中正在讨论的单例实现的示例代码几乎相同。那篇文章很好,我推荐它 他们的建议是使用。在您的代码中,这类似于:
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;
}
}
}
公共类SearchProviderFactory{
私营静电发生器厂;
私有静态字典providerMap=新字典();
私有SearchProviderFactory(){
//下一行有错误
providerMap.Add(“公司名称”,Type.GetType(“MyApp.CompanySearchProvider”);
providerMap.Add(“job_title”,Type.GetType(“MyApp.JobTitleSearchProvider”);
}
公共静态SearchProviderFactory实例{
得到{
如果(工厂==null){
锁(providerMap)
{
如果(工厂==null){
factory=新的SearchProviderFactory();
}
}
}
返回工厂;
}
}
}
我没有编译这段代码,更不用说对它进行压力测试了。如果你尝试过,请让我知道这是否有效 实际上,我刚刚决定在我的全局初始化中调用实例方法,以确保这种情况不会再次发生。我现在很少看到使用双空检查+锁定技术。现在,大多数人都使用了
惰性
包装器。
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;
}
}
}