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的第二个类正在接收一个带有空列表的新实例。

Singleton实例始终为null

此代码的锁在错误的位置:

if (_instance == null)
{
    lock (syncRoot)
    {
        _instance = new Foo();
    }
}

当线程1创建_instance时,第二个线程将阻塞锁,然后在释放锁时重新创建_instantion。

另一件需要注意的事情是,您永远不应该在IIS中跨服务器查找依赖静态变量。应用程序池可以随时回收。

结论是asp.net正在创建域的新实例,并且每次都会导致一个新的singleton对象。我已经搜索了如何在域之间同步对象,但这对我来说太"变通"了,所以我决定添加一个布尔列,通过确认或失败来更新值。

感谢大家