• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

lock Dictionary 对象中的项能否达到预期

歪歪 2011-11-29 02:31:10
请教:
一般的代码都是

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的效果一致呢。
...全文
67 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
歪歪 2011-11-29
谢谢,帖子莫人气啊。三点半结贴。。。
回复
阿非 2011-11-29
那可以达到预期效果
回复
歪歪 2011-11-29
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;
}
}
}
回复
歪歪 2011-11-29
自己顶一下
回复
阿非 2011-11-29
lockHelper[typeKey] 不变的话,可以
回复
相关推荐
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2011-11-29 02:31
社区公告

让您成为最强悍的C#开发者