Singleton实例始终为null
本文关键字:null 实例 Singleton | 更新日期: 2023-09-27 18:21:27
我有一个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);
}
}
}
}
当一个类第一次获得这个类的实例时,它将返回一个新的/干净的foo类实例,正如预期的那样,然后填充列表。然而,将从同一列表中删除itens的第二个类正在接收一个带有空列表的新实例。
此代码的锁在错误的位置:
if (_instance == null)
{
lock (syncRoot)
{
_instance = new Foo();
}
}
当线程1创建_instance时,第二个线程将阻塞锁,然后在释放锁时重新创建_instantion。
另一件需要注意的事情是,您永远不应该在IIS中跨服务器查找依赖静态变量。应用程序池可以随时回收。
结论是asp.net正在创建域的新实例,并且每次都会导致一个新的singleton对象。我已经搜索了如何在域之间同步对象,但这对我来说太"变通"了,所以我决定添加一个布尔列,通过确认或失败来更新值。
感谢大家