Необходимо ли защищать доступ к одной переменной ссылочного типа в многопоточном приложении? В настоящее время я блокирую эту переменную следующим образом:Необходим ли замок в этой ситуации?
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 - неизменный класс: все поля задаются в конструкторе и не меняются. Чтобы что-то изменить, создается новый экземпляр и назначается переменной выше.
Предположим, я спросил вас: «Замок на двери нужен?» Вы вполне можете ответить, заметив, что я не описал дверь или задачу, которую должна выполнить дверь. Блокировка необходима на двери, если задача, которую была придумана дверью, не может быть достигнута без добавления замка. Никто не может сказать вам, может ли задача, для которой предназначена ваша переменная, без блокировки, если вы не сообщите им, что это за задача. Дайте * подробное и полное * объяснение * каждого возможного сценария потоковой передачи *, в котором может использоваться переменная, и какую семантику вы хотите выполнять в каждой. –