我有一个带有当前单例类的MVC程序的ASP.net:
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的第二个类接收带有空列表的新实例。
答案 0 :(得分:1)
此代码的锁定位置错误:
if (_instance == null)
{
lock (syncRoot)
{
_instance = new Foo();
}
}
当线程1创建_instance时,第二个线程将阻塞锁,然后在释放时重新创建_instance。
另外要注意的是,在服务器查找中,不应该依赖IIS中的静态变量。应用程序池可以随时回收。
答案 1 :(得分:0)
结论是asp.net正在创建域的新实例,并且每次都会导致一个新的单例对象。我已经搜索了如何在域之间同步对象,但这对我来说太“解决”了,所以我决定添加一个布尔列,用确认或失败更新值。
谢谢大家