Страницы

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

пятница, 13 марта 2020 г.

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

#c_sharp #распараллеливание


У меня в коде много блокировок. Хотел немного сократить код и написал небольшой велосипед.
Скажите пожалуйста будет ли это работать должным образом?

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();
        }
    }
}

    


Ответы

Ответ 1



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

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

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