c# – 我可以使用字典元素作为锁定对象吗?
发布时间:2020-12-15 04:08:28 所属栏目:百科 来源:网络整理
导读:我有多个队列正在被多个线程访问.为了实现线程安全,我做了以下事情: private static Dictionarystring,Queuestring MyQueues = new Dictionarystring,Queuestring();public static string GetNextQueueElementForKey(string key){ string res = string.Empt
我有多个队列正在被多个线程访问.为了实现线程安全,我做了以下事情:
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是一个可实例化的类. (我假设你实际上只是从多个线程中读取字典?使用字典进行多线程读/写是不安全的.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |