¿Es necesario proteger el acceso a una sola variable de un tipo de referencia en una aplicación multiproceso? Actualmente bloqueo esa variable de esta manera:¿Es necesario un bloqueo en esta situación?
private readonly object _lock = new object();
private MyType _value;
public MyType Value
{
get { lock (_lock) return _value; }
set { lock (_lock) _value = value; }
}
Pero me pregunto si esto es realmente necesario? ¿La asignación de un valor a un campo no es atómica? ¿Algo puede salir mal si no bloqueo este caso?
P.S .: MyType es una clase inmutable: todos los campos están establecidos en el constructor y no cambian. Para cambiar algo, se crea una nueva instancia y se asigna a la variable anterior.
Supongamos que le pregunté "¿es necesario un candado en una puerta?" Puede responder al señalar que no he descrito la puerta o la tarea que la puerta debe realizar. Se necesita un candado en una puerta si la tarea para la que se inventó la puerta no se puede lograr sin agregar un candado. Nadie puede decirle si la tarea para la que está diseñada su variable se puede lograr sin un bloqueo a menos que le diga cuál es esa tarea. Proporcione una * explicación detallada y completa * de * todos los posibles escenarios de subprocesamiento * en los que se pueda usar la variable, y qué semántica desea que suceda en cada uno. –