У меня в коде много блокировок. Хотел немного сократить код и написал небольшой велосипед. Скажите пожалуйста будет ли это работать должным образом?
public static class LockingCall
{
public static readonly object LockObject = new object();
public static void Invoke(Action action)
{
lock (LockObject)
{
action();
}
}
public static T Invoke
Ответ
lock блокирует только тех, у кого общий объект блокировки. Поэтому нужно избегать использования статических или слишком общих объектов для этого. Блокировка должна быть минимальной и значит объект блокировки должен затрагивать минимально необходимое количество держателей блокировки (если нужно то использовать именованные блокировки) и блокировать как можно меньшую секцию кода.
Также неправильно блокировать lock(this), потому что кто-то внешний может вызвать lock(обьект в котором lock(this) ) и получится неожиданная блокировка.
Ну и конечно по возможности использовать другие методы в виде потокобезопасных коллекций и async/await
Комментариев нет:
Отправить комментарий