У меня есть ASP.net MVC с программой с текущим классом одноэлементным:экземпляра Singleton всегда нуль
public sealed class Foo
{
private static volatile Foo_instance;
private static object syncRoot = new Object();
private List<Obj> _objList;
private Foo()
{
_objList = new List<Obj>();
}
public static Foo Instance
{
get
{
if (_instance == null)
{
lock (syncRoot)
{
_instance = new Foo();
}
}
return _instance;
}
}
public void AddObjToList(Obj _object)
{
lock (_instance)
{
_objList.Add(_object);
}
}
public void FindAndRemoveObj(string id)
{
lock (_instance)
{
Obj _object = null;
_object= _objList.FirstOrDefault(t => t.UniKey == id);
if (_object!= null)
{
_objList.Remove(object);
}
}
}
}
В первый раз, что класс получить экземпляр этого класса он будет возвращать новый/чистый instace из класса foo, как и ожидалось, а затем заполнив список, но второй класс, который удалит itens из того же списка, получит новый экземпляр с пустым списком.
Во-первых, вы должны дважды проверить, что ваше _instance равно null. Чтобы сделать это, вы должны проверить, не потеряно ли значение _instance после блокировки (syncRoot). В противном случае несколько потоков могут закончиться новым. Во-вторых, я бы советовал не применять Singletons таким образом в приложении MVC. Знаете ли вы, что такое статическое время жизни при размещении на веб-сервере? Используйте надлежащую структуру IOC для управления временем лишения времени. –
Похоже, я был ниндзя Фил. Он в основном пишет то же, что и я: «Двойной замок» и не использует статику в IIS. –
Хорошо, поэтому мои знания о двойной проверке были ошибочными. Спасибо за объяснение. Я в настоящее время использую UnityFramework –