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