【发布时间】:2013-06-07 20:55:52
【问题描述】:
我有多个队列正在被多个线程访问。为了实现线程安全,我做了以下事情:
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,但是我会锁定更多的东西。所以我的问题是,如果锁定字典中包含的对象会起作用 - 假设键的值(队列)永远不会改变。
【问题讨论】:
-
您的问题更像是一个陈述。你还有什么问题?
-
您不会锁定对象,而是锁定对对象的引用。所以换句话说,对象的值是否改变并不影响锁。
-
@Nolonar 不,您锁定了对象本身。你可以有 17 个对同一个对象的引用——它们都会锁定同一个东西。
-
@Yogee 我看不出
GetHashCode()在这里有什么相关性,或者为什么有人想在哈希码上使用ToString()- 事实上你几乎肯定应该从不 锁定string- 你能澄清一下你在说什么吗? -
@yogee:不锁定对象的地址;垃圾收集器可以移动对象的地址!它锁定被引用对象中的同步块。当然,这是一个实现细节。
标签: c# multithreading locking