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

198
15 октября 2017, 20:34

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

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

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

Answer 1

Реализация технически верна.

Но.

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

Таким образом, вы должны определить ваши сценарии использования (например — вызов публичных методов), и обеспечить потокобезопасность этих сценариев.

READ ALSO
Windows Forms Application в Rider

Windows Forms Application в Rider

В Visual Studio есть Windows Forms ApplicationА есть ли это в Rider? Никак не могу найти

285
Прерывание выполнения метода &ldquo;А&rdquo; на время выполнения метода &ldquo;Б&rdquo;

Прерывание выполнения метода “А” на время выполнения метода “Б”

Доброго времени сутокПытаюсь реализовать очередь на отправку сообщений

182
Не может обработать исключение AccessViolationException

Не может обработать исключение AccessViolationException

Вот тут вызывается сам nativeCall

269
объеденить строчки json

объеденить строчки json

Имеется такой json:

377