微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.jb51.cc/csharp/92660.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐