Страницы

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

суббота, 11 января 2020 г.

Правильно ли реализовано потокобезопасное свойство?

#c_sharp #net


Есть ли смысл в следующем коде:

object _sync = new object();
bool _property;
public bool MyProperty
{
        get
        {
            lock (_sync)
                return _property;
        }
        set
        {
            lock (_sync)
                _property = value;
        }
    }


Какие подводные камни могут быть при чтении\записи этого свойства из нескольких потоков?
    


Ответы

Ответ 1



Реализация технически верна. Но. Вы не должны думать о потокобезопасности в терминах отдельных свойств объекта. Потокобезопасность — свойство всего объекта, и всех определённых на нём операций. К примеру, если у вас есть свойство Age и свойство IsUnderage, которое должно равняться true тогда и только тогда, когда Age < 18. Если вы сделаете потокобезопасными оба свойства по отдельности, между установкой первого и второго останется момент, в который они несогласованы — таким образом, ваш класс как целое всё ещё не потокобезопасен. Таким образом, вы должны определить ваши сценарии использования (например — вызов публичных методов), и обеспечить потокобезопасность этих сценариев.

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

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