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的效果一致呢。
...全文
109 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
歪歪 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] 不变的话,可以

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧