【问题标题】:Read only Dictionary - multiple threads calling .ContainsKey method只读字典 - 多个线程调用 .ContainsKey 方法
【发布时间】:2011-05-16 06:48:10
【问题描述】:

我有一个静态的只读字典。 不会对此词典进行修改。

我有多个线程使用 .ContainsKey(Key) 从该字典中读取。例如

class MyData
{ 
    private static private IDictionary<int, string> _dictionary = new Dictionary<int, string>();

    MyData()
    {
        // Load Dictionary here
    }

    public string GetValue(int key)
    {
        if (_dictionary.ContainsKey(key))
        { 
            return _dictionary[key];   
        }
    }
}

这样做有线程问题吗?

【问题讨论】:

    标签: c# .net multithreading concurrency dictionary


    【解决方案1】:

    如果您要同时写入数据(并且您使用的是 .NET 4.0),那么您可以使用 ConcurrentDictionary

    【讨论】:

      【解决方案2】:

      如果在您从多个线程中读取之前所有的“添加”都已完成,那么就可以了。仅仅因为它的只读并不意味着它的线程安全——它不是。

      也许你应该使用ReaderWriterLock 来同步访问

      【讨论】:

        【解决方案3】:

        如果你只是阅读,那是安全的。

        【讨论】:

          【解决方案4】:

          如果没有人对其进行变异:这很好。如果有偶尔编辑,那么也许看看 ReaderWriterLockSlim,或者(我的偏好)编辑快照/副本并交换参考。

          【讨论】:

          • 但是在交换引用时您仍然需要 ReaderWriterLockSlim,对吧?
          • @Mark:编写引用保证是原子的,但我猜你可能想标记字段volatile 以确保任何其他线程看到更改。
          • 我想我在想,如果你在运行 ContainsKey 方法的过程中换掉引用,那么它可能会导致问题?
          • @Mark:您的目标应该是使用TryGetValue,而不是dict.ContainsKey,后跟dict[key]。如果你这样做,那么旧的 ref 将被读取一次,你将从字典的旧副本中获取你的值。
          • @Mark - 使用 TryGetValue 您只需取消引用一次,因此行为定义明确(有效);如果您执行单独的 ContainsKey 然后获取,则需要要么将引用复制到局部变量中,否则第二次取消引用的风险是具有不同数据的不同字典。
          猜你喜欢
          • 2012-04-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-17
          • 1970-01-01
          相关资源
          最近更新 更多