请教:
一般的代码都是 private static Dictionary<string,int> typeData = new Dictionary<string,int>();
private static object lockHelper = new object();
static void Work(string typeKey)
{
    lock(lockHelper){
       //执行一些相同的操作,比如
       typeData[typeKey] = typeData[typeKey] + 3;
    }
}但是我需要频繁的调用Work方法,比如Work("test1")就可能出现一秒钟调用十来次的情况,还有Work("test2")Work("test_n"),所以这个写法应该是有问题的,那如果我换成下面的写法不知是否能达到预期
private static Dictionary<string,int> typeData = new Dictionary<string,int>();
private static Dictionary<string, object> lockHelper = new Dictionary<string, object>();
static void Work(string typeKey)
{
    lock(lockHelper[typeKey]){ //lockHelper[typeKey]是确定存在且已经初始化了的 lockHelper[typeKey] = new object();
       //执行一些相同的操作,比如
       typeData[typeKey] = typeData[typeKey] + 3;
    }
}另外如果用ReaderWriterLockSlim是否和前面的使用一个object的效果一致呢。

解决方案 »

  1.   

    lockHelper[typeKey] 不变的话,可以
      

  2.   

    lockHelper的项是没有变动的public static class Demo
        {
            private static Dictionary<string, int> typeData = new Dictionary<string, int>();
            private static Dictionary<string, object> lockHelper = new Dictionary<string, object>();        static Demo()
            {
                List<string> configData = new List<string>() { "test1", "test2" }; //从配置文件中获取的,运行时项不会有变动
                foreach (var data in configData)
                {
                    typeData.Add(data, 0);
                    lockHelper.Add(data, new object());
                }
            }        static void Work(string typeKey)
            {
                if (typeData.ContainsKey(typeKey) == false) return;            lock (lockHelper[typeKey])
                { 
                    //执行一些相同的操作,比如
                    typeData[typeKey] = typeData[typeKey] + 3;
                }
            }
        }