请教大家一个问题多线程访问并修改单利里的数据到底是否线程安全?是否同步?我在单利中有一个List对象,多个线程多其进行添加或修改操作,我发现有时候会报错,提示多线程访问有冲。迷茫了...
哪位神仙指点一下多线程 单利List同步

解决方案 »

  1.   

    List的实例可不是线程安全的,这个MSDN写的清清楚楚明明白白。自己处理同步去。
      

  2.   

    list不是线程安全的我知道,微软还有一个线程同步的List类,问题是,单利是线程安全的,里面的List或hashtable等数据都应该是线程安全的呀
      

  3.   

    多线程同时修改list会报错很正常吧 要自己加锁
      

  4.   

    你直接用个readwritelockslim不就完了么?这要毛线开源的东西啊
      

  5.   

    我不想再代码中到处使用lock,所以想使用开源的库把加锁这种低级且必要的操作给封装掉。
    谁知道有相关的类库吗,
      

  6.   

    public static class PermanentCache
        {
            static Dictionary<string, object> cache = new Dictionary<string, object>();
            static ReaderWriterLockSlim readWriteLock = new ReaderWriterLockSlim();        public static object GetObject(string key)
            {
                object retValue;
                try
                {
                    readWriteLock.EnterReadLock();
                    cache.TryGetValue(key, out retValue);
                }
                finally
                {
                    readWriteLock.ExitReadLock();
                }
                return retValue;
            }
    public static void Set(string key, object obj)
            {
                readWriteLock.EnterUpgradeableReadLock();
                try
                {
                    object result;
                    if (cache.TryGetValue(key, out result))
                    {
                        if (result != obj)
                        {
                            readWriteLock.EnterWriteLock();
                            try
                            {
                                cache[key] = obj;
                            }
                            finally
                            {
                                readWriteLock.ExitWriteLock();
                            }
                        }
                    }
                    else
                    {
                        readWriteLock.EnterWriteLock();
                        try
                        {
                            cache.Add(key, obj);
                        }
                        finally
                        {
                            readWriteLock.ExitWriteLock();
                        }
                    }
                }
                finally
                {
                    readWriteLock.ExitUpgradeableReadLock();
                }
            }
    }
      

  7.   

     public class ThreadShareData
        {
            static readonly ThreadShareData entity = new ThreadShareData();
            List<Task> _listUrl = new List<Task>();
            private ThreadShareData()
            {
            }
            static public ThreadShareData Instance()
            {
                return entity;
            }
         
            //需要访问的url列表
            public List<Task> ListUrl
            {
                get { return _listUrl; }
                set { _listUrl = value; }
            }
    }
    多线程访问ThreadShareData.ListUrl是线程安全的,这样也可实现数据多线程访问的目的。可是我有时候报错,让我很意外。
      

  8.   

    线程操作List,要加锁
    lock(lst)
    {
       //对lst操作
       ....
    }
      

  9.   


    多线程访问ThreadShareData.ListUrl是线程安全的
    这是谁告诉你的?劝你左右开弓抽他一个360度大嘴巴。
      

  10.   

    http://segmentfault.com/q/1010000000094711
      

  11.   


    看能不能把list分段
    然后线程去用或者修改
      

  12.   

    大家解答了我的问题,又似乎没有说清楚。
    第一 如果单利里的list没有同步,为什么他不报错(访问冲突)。
    第二,我在单利里用list的方式可能不对,list是线程安全的,但是list里面的值是不安全的,即可能出现脏数据,对不对?除非对list 加lock才能保证list里的元素不会错
      

  13.   

    根据你代码感觉你的需求是需要不同线程能够添加删除TASK,如果是这样你根本就不应该暴露你那个property,相反你应该暴露两个实例方法分别去获取一个task实例和删除一个task实例,然后在这两个方法的实现上去确保线程安全。
    而且你的确对单例理解有偏差,你这样的写法只能保证所有线程获取到的对象是同一个实例,但不保证你这个实例方法中的线程安全。
      

  14.   

    你操作那个list的时候有一定几率会报错,比如你在往这个list里面添加数据时同时list已经达到其最大容量需要扩容的时候。
    List<T>中提供的所有实例方法都是非线程安全的,你所谓的脏数据的定义是什么?