c# - 如果我只是阅读它,我应该锁定字典吗?
问题描述
我有一个存储字典的类。一个线程可以在另一个函数中编辑这个字典。鉴于它正在写入这本字典,我确保它被包裹在锁中。例如:
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
on the reads,以保护其他读者。
您可能会发现它更易于使用ConcurrentDictionary<TKey, TValue>
(任意数量的读取器和/或写入器),或者如果您不介意丢失泛型:(Hashtable
最多一个写入器与任意数量的读取器并发,即您只需要同步写入)。
推荐阅读
- flutter - 多少个 setState() 调用对于 Flutter 来说是多余的?
- c++ - 用于赋值的参数化构造函数
- elasticsearch - 弹性搜索快照和备份特定时间间隔的数据
- ssl - ssl 协商针对同一个域发生多次
- javascript - 与 selenium 相关的量角器不断连接到 localhost
- node.js - 有没有办法使用 Morgan-body 在 express.js 中创建自定义日志格式?
- python - Python 控制台立即从 Windows 命令提示符退出
- function - 在 Makefile 函数中设置变量值时遇到问题
- java - 如何引用我的数据库或指向该特定 UID?
- javascript - 如何使用 nodejs 将 base64 编码图像转换为 TIFF/png/jpeg