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

前端之家收集整理的这篇文章主要介绍了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是一个可实例化的类.

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

原文链接:https://www.f2er.com/csharp/92660.html

猜你在找的C#相关文章