我已经声明了一个dictionary字典:
Dictionary<String, Dictionary<String, String>> values;
我有一个获取特定索引的字典的方法:
public Dictionary<String,String> get(String idx)
{
lock (_lock)
{
return values[moduleName];
}
}
如您所见,我在多线程环境中工作。 我的问题是我是否需要像这样返回我的字典的副本才能保证线程安全:
public Dictionary<String,String> get(String idx)
{
lock (_lock)
{
return new Dictionary<string, string>(values[moduleName]);
}
}
如果我不这样做,调用 getter 的类是否会收到一个副本(因此,如果我从我的 Dictionary<String, Dictionary<String, String>>
中删除该字典,它是否仍然有效)?
干杯,
蒂埃里。
最佳答案
Dictionary<>
不是线程安全的,但是 ConncurrentDictionary<>
是。
调用 getter 的类会收到一个引用,这意味着如果您将它从 values
中删除,它仍会存在-字典,因为只要您在某处有引用,GC 就不会清理它,您只是无法再使用 getter 获取它。
基本上这意味着您在使用 Dictionary<>
时有两种可能性。 :
- 返回副本:坏主意,因为如果您更改配置,您的应用程序中将有两种不同的配置“有效”
- 锁定实例:这将使它成为线程安全的,但随后使用
ConcurrentDictionary<>
因为它正是为你做的
关于c# - 在多线程环境中返回 C# 中的字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8984008/