c# - 如果我只是阅读字典,我应该锁定字典吗?

标签 c# dictionary thread-safety locking

我有一个存储字典的类。一个线程可以在另一个函数中编辑这个字典。鉴于它正在写入这本字典,我确保它被锁在锁中。例如:

        public void SetModuleLogLevel(string module, LogLevel logLevel)
        {
            if (module == "Other" || !this._moduleToLogLevel.ContainsKey(module)) 
                return;

            lock (this._lock)
            {
                this._moduleToLogLevel[module] = logLevel;
            }
        }

我有另一个函数从这个字典返回值。例如,

        private bool IsUrgentToLog(string module, LogLevel logLevel)
        {
            if (!this._moduleToLogLevel.ContainsKey(module)) return false;

            lock (this._lock)
            {
                if (this._moduleToLogLevel[module] < logLevel) return true;
            }

            return false;
        }

鉴于我只是在这个函数中读取这本字典,它需要锁吗?

最佳答案

Dictionary<TKey, TValue>当任何线程对其进行变异时,不做任何保证,即您可以拥有“任意数量的读者”或“至多一个作者,零个读者”。所以:如果它可以发生突变:是的,你确实需要一个 lock阅读,以保护其他读者。

您可能会发现使用 ConcurrentDictionary<TKey, TValue> 更容易(任意数量的读者和/或作者),或者如果您不介意丢失泛型:Hashtable (最多一个写入器任意数量的读取器并发,即您只需要同步写入)。

关于c# - 如果我只是阅读字典,我应该锁定字典吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60479447/

相关文章:

c# - 在 C# .NET 中将字符串列表转换为单引号列表

c# - 在列表中选择与界面匹配的项目

python - 使用字典查找文本文件中出现次数最多的单词

java - StringBuilder 是线程安全的(与 parallelStream 一起使用)吗?

c# - 如何对 DataGrid 的列重新排序?

c# - 如何使用 Reflection.Emit 根据 IL 动态编写 C# 类

sorting - 如何通过嵌套值对 map 重新排序

dictionary - 避免需要冗余检查以映射给定的字符串零值?

c++ - 只读操作的 std::map 线程安全

java - get 和 set 方法的同步