C# · 12月 26, 2021

c# – 我可以使用字典元素作为锁定对象吗?

我有多个队列正在被多个线程访问.为了实现线程安全,我做了以下事情: private static Dictionary<string,Queue<string>> MyQueues = new Dictionary<string,Queue<string>>();public static string GetNextQueueElementForKey(string key){ string res = string.Empty; if (MyQueues.Keys.Contains(key)) { Queue<string> queue = MyQueues[key]; lock (queue) { if (queue.Count() > 0) { res = queue.Dequeue(); } } } return res;}

我也可以锁定MyQueues,但是我会锁定超过必要的数量.所以我的问题是,如果锁定字典中包含的对象将起作用 – 假设一个键的值(队列)永远不会改变.

解决方法 你可以 – 但我通常不会.我个人经常试图锁定普通的System.Object实例,这些实例不用于其他任何事情,理想情况下甚至不会暴露给除锁定类之外的任何代码.这样你就可以绝对确定没有别的东西可以锁定.

在这种情况下,看起来您已经控制了队列,因此您知道它们不会被其他代码使用,但Queue< T>中的代码可能会被使用.会锁定这个.情况可能并非如此,但这是我会担心的事情.

从根本上说,我希望.NET没有采用Java的“每个对象的监视器”的方法 – 我希望Monitor是一个可实例化的类.

(我假设你实际上只是从多个线程中读取字典?使用字典进行多线程读/写是不安全的.)