一个 Web 应用程序有 2 个单例类实例



我有一个单例类,其中放置了对象列表。所以我有一个将项目设置为该列表的类。然后,我有另一个类从该单例类获取对象列表。我的问题是当我收到一条 nservicebus 消息并从单例类获取列表时,有时列表不包含任何对象。有时对象存在。所以,我所做的是每次我得到单例实例时,我都会执行"GetHashCode"并确认单例类有 2 个不同的实例。我的代码实现不正确了什么?

public class SingletonClass
{
    private static readonly object _lockObj = new object();
    private static readonly object _lockObjList = new object();
    static SingletonClass _singletonClass;
    private static List<object> _objList;

    private SingletonClass()
    {
    }
    public static SingletonClass Instance
    {
        get
        {
            lock(_lockObj)
            {
                if (null == _singletonClass)
                {
                    _singletonClass= new SingletonClass();
                    _objList = new List<object>();
                }
                return _singletonClass;
            }
        }
    }
    public List<obj> GetList()
    {
        lock(_lockObjList)
        {
            return _objList;
        }
    }
    public void UpdateProgress(int index, double value)
    {
        lock(_lockObjList)
        {
            _objList[index].Progress = value;
        }
    }

    public void SetList(List<obj> objs)
    {
        lock(_lockObjList)
        {
            _objList = objs;
        }
    }
}
public class MessageHandler : HubInvoker<MessageHub>
{
    public MessageHandler () {}
    public void OnReceiveMessage(object sender, MessageArgs args)
    {
        var list = SingletonClass.Instance.GetList();
        if(list != null){
            var i = 0;
            for(; i < list.Length && list[i].Id == args.Id; i++);
            if(i < list.Length)
            {
                SingletonClass.Instance.UpdateProgress(i, args.Progress);
            }
        }
    }
}
public class ObjController
{
     public ObjController() {}
     public void SetList(List<obj> objs)
     {
         SingletonClass.Instance.SetList(objs);
     }
}

编辑

我在上面添加了一些代码,以获取有关我的实现的更多信息。

您将需要实现双重检查锁定,请参阅此处,并根据您的设置使用volatile 关键字。请参阅下面的代码:

public static SingletonClass Instance
{
    get
    {
        if (null == _singletonClass)
        {
            lock (_lockObj)
            {
                if (null == _singletonClass)
                {
                    _singletonClass = new SingletonClass();
                    _objList = new List<object>();
                }
                return _singletonClass;
            }
        }
    }
}

最新更新