c# - 在多线程环境中返回 C# 中的字典

标签 c# concurrency dictionary return

我已经声明了一个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/

相关文章:

C#、java DataInputStream.readFully() 等效项

google-app-engine - Appengine 数据存储区超时错误 5 和 11 之间有什么区别?

multithreading - 系统在程序中的哪些点切换线程

java - 如何使用 map 节省空间

Python dict.get 返回 0 评估为 false

mysql - 数据字典 - 初学者

c# - 何时使用 Lazy 与 Func

c# - 基于原始 SDK 的 kinect 数据需要什么校正数学

c# - Camel 套管的缩写?

scala - 如何保证Actor的响应时间?