Чтобы ответить на ваш вопрос (как уже некоторые другие), есть некоторые потенциальные проблемы с примером кода, который вы предоставили:
private static string mutex= "ABC";
- Переменная
mutex
не является неизменной.
- Строковый литерал
"ABC"
будет ссылаться на одну и ту же ссылку на интернированный объект везде в вашем приложении.
В общем, я бы советовал не блокировать строки. Однако в одном случае я столкнулся с тем, где это полезно сделать.
Были случаи, когда я поддерживал словарь объектов блокировки, где ключ является чем-то уникальным для некоторых моих данных. Вот надуманный пример:
void Main()
{
var a = new SomeEntity{ Id = 1 };
var b = new SomeEntity{ Id = 2 };
Task.Run(() => DoSomething(a));
Task.Run(() => DoSomething(a));
Task.Run(() => DoSomething(b));
Task.Run(() => DoSomething(b));
}
ConcurrentDictionary<int, object> _locks = new ConcurrentDictionary<int, object>();
void DoSomething(SomeEntity entity)
{
var mutex = _locks.GetOrAdd(entity.Id, id => new object());
lock(mutex)
{
Console.WriteLine("Inside {0}", entity.Id);
// do some work
}
}
Целью такого кода является сериализация параллельных вызовов DoSomething()
в контексте Id
объекта. Недостатком является словарь. Чем больше сущностей, тем больше становится. Это также просто больше кода, чтобы читать и думать.
Я думаю, что интернирование строк в .NET может упростить вещи:
void Main()
{
var a = new SomeEntity{ Id = 1 };
var b = new SomeEntity{ Id = 2 };
Task.Run(() => DoSomething(a));
Task.Run(() => DoSomething(a));
Task.Run(() => DoSomething(b));
Task.Run(() => DoSomething(b));
}
void DoSomething(SomeEntity entity)
{
lock(string.Intern("dee9e550-50b5-41ae-af70-f03797ff2a5d:" + entity.Id))
{
Console.WriteLine("Inside {0}", entity.Id);
// do some work
}
}
Разница в том, что я полагаюсь на интернирование строк, чтобы дать мне одну и ту же ссылку на объект для каждого идентификатора объекта. Это упрощает мой код, потому что мне не нужно вести словарь экземпляров мьютекса.
Обратите внимание на жестко запрограммированную строку UUID, которую я использую в качестве пространства имен. Это важно, если я решу применить тот же подход блокировки строк в другой области моего приложения.
Блокировка строк может быть хорошей или плохой идеей в зависимости от обстоятельств и внимания, которое разработчик уделяет деталям.