У меня есть несколько очередей, к которым обращаются несколько потоков. Для достижения потокобезопасности, я сделал следующее:Могу ли я использовать словарные элементы в качестве объектов блокировки?
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
@Nolonar нет, вы блокируете сам объект. У вас может быть 17 ссылок на один и тот же объект - все они будут блокировать одно и то же. –