多线程访问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实例,然后在这两个方法的实现上去确保线程安全。
而且你的确对单例理解有偏差,你这样的写法只能保证所有线程获取到的对象是同一个实例,但不保证你这个实例方法中的线程安全。