日期:2014-05-18 浏览次数:20512 次
private static object _lockObj = new object(); ... lock(_lockObj) { if (!_EnumList.ContainsKey(keyName)) { _EnumList.Add(keyName, list); } }
------解决方案--------------------
楼上正解。
如果没有做这个压力测试,LZ估计都不会发现这个问题,即使发现了,查代码也很难查出来。
------解决方案--------------------
lock (syncObj)
{
if (!_EnumList.ContainsKey(keyName))
{
lock(syncObj)
{
_EnumList.Add(keyName, list);
}
}
}
syncObj 需要static
------解决方案--------------------
object锁也不要用一次new一次,用一次new一次跟没锁一样。
错误2也是并发问题吧。
如果多线程公用一个Dictionary,可能会这样子。
------解决方案--------------------
_EnumList是全局静态就应该考虑并发问题。
可以用父接口ICOLLECION的SyncRoot静态成员lock
也可以定义static object来lock