首页 > 解决方案 > 如果我只是阅读它,我应该锁定字典吗?

问题描述

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

        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;
        }

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

标签: c#dictionarythread-safetylocking

解决方案


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

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


推荐阅读