Действительно ли необходимо защитить доступ к единственной переменной ссылочного типа в многопоточном приложении? Я в настоящее время блокирую ту переменную как это:
private readonly object _lock = new object();
private MyType _value;
public MyType Value
{
get { lock (_lock) return _value; }
set { lock (_lock) _value = value; }
}
Но я задаюсь вопросом, действительно ли это необходимо? Разве присвоение значения к полю не является атомарным? Что-нибудь может пойти не так, как надо, если я не блокирую в этом случае?
P.S.: MyType является неизменным классом: все поля установлены в конструкторе и не изменяются. Для изменения чего-то новый экземпляр создан и присвоен переменной выше.
Быть атомным достаточно редко.
Я вообще хочу получить новейшее значение для переменной, а не потенциально увидите stare одно - так требуется какой-то барьер памяти, как для чтения, так и для записи. Блокировка - это простой способ получить это право на стоимость потенциально потерять некоторую производительность из-за конкуренции.
I использовал , чтобы полагать, что для того, чтобы сделать вариабельный волатильный летучий, будет достаточно в этой ситуации. Я больше не убежден, что это так. По сути, теперь я стараюсь избегать написания кода без блокировки, когда участвуют общие данные, если я не могу использовать строительные блоки, написанные людьми, которые действительно понимают эти вещи (например, Джо Даффи).
все зависит от того, будет ли свойство доступно нескольким потокам. и некоторая переменная, как говорят, является атомной операцией, в этом случае атомной операции нет необходимости использовать блокировку. извините за плохой английский.
В вашем случае, незыблемый, я думаю, блокировка не нужна.
-121--2943696-Для этого существует ключевое слово volatile . Безопасно ли без этого, зависит от сценария. Но компилятор может делать смешные вещи , такие как реорганизация порядка работы. Поэтому даже чтение/запись в одно поле может быть небезопасной.
-121--2943693-Это может быть проблемой. Это не только само задание, которым ты должен заниматься. Из-за кэширования параллельные потоки могут видеть старую версию объекта, если не заблокировать. Так что необходимость блокировки будет зависеть от того, как именно вы ее используете, и вы этого не покажете.
Вот бесплатный образец главы «Параллельное программирование в Windows» , в которой подробно объясняется эта проблема.
Для этого есть WOLATILE ключевое слово для этого. Независимо от того, безопасно ли без этого зависит от сценария. Но компилятор может сделать Смешные вещи , такие как реорганизовать порядок работы. Так что даже чтение / запись в одно поле может быть небезопасно.
Все зависит от того, будет доступ к недвижимости несколькими потоками. И некоторые переменные считаются атомной операцией, в этом случае атомной операции нет необходимости использовать замок. Извините за плохой английский.
В вашем случае, неизменный, я думаю, замок не нужен.