我有多个队列被多个线程访问。为了实现线程安全,我做了以下事情:
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>
中的代码将锁定 this
.情况可能并非如此,但这是我会担心的事情。
从根本上说,我希望 .NET 没有采用 Java 的“每个对象的监视器”方法 - 我希望 Monitor
是一个可实例化的类。
(我假设您实际上只是从多个线程读取字典?使用字典进行多线程读/写是不安全的。)
关于c# - 我可以使用字典元素作为锁定对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16984598/