Страницы

Поиск по вопросам

пятница, 31 мая 2019 г.

Будет ли блокировка работать правильно?

У меня в коде много блокировок. Хотел немного сократить код и написал небольшой велосипед. Скажите пожалуйста будет ли это работать должным образом?
public static class LockingCall { public static readonly object LockObject = new object();
public static void Invoke(Action action) { lock (LockObject) { action(); } }
public static T Invoke(Func function) { lock (LockObject) { return function(); } } }


Ответ

lock блокирует только тех, у кого общий объект блокировки. Поэтому нужно избегать использования статических или слишком общих объектов для этого. Блокировка должна быть минимальной и значит объект блокировки должен затрагивать минимально необходимое количество держателей блокировки (если нужно то использовать именованные блокировки) и блокировать как можно меньшую секцию кода.
Также неправильно блокировать lock(this), потому что кто-то внешний может вызвать lock(обьект в котором lock(this) ) и получится неожиданная блокировка.
Ну и конечно по возможности использовать другие методы в виде потокобезопасных коллекций и async/await

Комментариев нет:

Отправить комментарий