首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

多线程访问list报错解决办法

2013-01-11 
多线程访问list报错请教大家一个问题多线程访问并修改单利里的数据到底是否线程安全?是否同步?我在单利中

多线程访问list报错
请教大家一个问题

多线程访问并修改单利里的数据到底是否线程安全?是否同步?

我在单利中有一个List对象,多个线程多其进行添加或修改操作,我发现有时候会报错,提示多线程访问有冲。迷茫了...
哪位神仙指点一下 多线程? 单利 List 同步
[解决办法]
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();
            }
        }
}
[解决办法]
根据你代码感觉你的需求是需要不同线程能够添加删除TASK,如果是这样你根本就不应该暴露你那个property,相反你应该暴露两个实例方法分别去获取一个task实例和删除一个task实例,然后在这两个方法的实现上去确保线程安全。
而且你的确对单例理解有偏差,你这样的写法只能保证所有线程获取到的对象是同一个实例,但不保证你这个实例方法中的线程安全。

热点排行