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

标签 c# multithreading locking

我有多个队列被多个线程访问。为了实现线程安全,我做了以下事情:

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/

相关文章:

WPF 多线程 : Using Dispatcher but the UI still hangs?

java - 单作者/单读者场景的 HashMap 或 ConcurrentHashMap?

c - 原子比较(不等于)和交换

c# - 我的数据库系统找不到 asp.net 中指定的文件

c# - 从数据库中获取数据的问题

c# - 如何使用 .NET 获取属性中的构造函数参数名称?

java - 静态同步方法提供了类级别的锁定。类级别锁定是什么意思?

c# - UserControl 的 ButtonClick 事件中的 RegisterStartupScript

locking - SVN : how to lock a file so that no one can modifiy it?

mysql - 为什么IX锁与InnoDB中的另一个IX锁兼容?