Invalidación de una referencia de objeto, mientras que otro hilo está ejecutando un método en ella (NET)
-
18-09-2019 - |
Pregunta
(Estoy interesado en el CLR .NET)
¿Qué ocurre exactamente cuando un hilo cambia el objeto de una variable referencias, mientras que otro hilo está ejecutando un método en el objeto original?
Por ejemplo, diga el tipo de Foo
tiene una variable 'Bar' de la Bar
tipo y Bar
no tiene un estado de nivel de clase (al menos por ahora, me gustaría mantener este escenario simple):
// Thread 1
foo.Bar = new Bar();
foo.Bar.SomeMethod();
Mientras tanto, antes de que esto termina de ejecutarse ...
// Thread 2
foo.Bar = new Bar();
¿Qué ocurre con el método que es (era?) Que se ejecuta en Tema 1? Es todo lo que necesita para completar ya en la pila?
¿Cambia cosas si rosca 2 hace esto en su lugar?
foo.Bar = null;
Solución
Si la llamada está garantizado para estar ya en el interior SomeMethod()
, entonces nada inusual que sucederá - this
es un argumento implícito de métodos, por lo que nunca usaría el valor del campo (o propiedad, cualquiera que sea) directamente
Si se puede garantizar realmente que es otra cosa.
Otros consejos
- edición: corregido confusa frase
Bueno, en realidad asignar a la variable será atómica, por lo que no es como la llamada de pronto se dará cuenta de 'oh Estoy nula!' durante la ejecución de .SomeMethod ()
Lo que puede suceder, sin embargo, es que foo.Bar.SomeMethod () en sí mismo no será llamado, porque Tema 2 tendrá que (tal vez) establecen a NULL en primer lugar; por lo que simplemente no se ejecutará (se bloquea con una excepción de referencia nula).
Lo mismo se aplica con el primer ejemplo; sólo se llamará .SomeMethod en el nuevo objeto.
Creo que estás pensando cosas pueden cambiar mientras se está ejecutando .SomeMethod, ¿verdad? No. Nada va a cambiar en ese país. Todavía tendrá el contexto de la misma.
¿Qué ocurre exactamente cuando un hilo cambia el objeto de una variable referencias, mientras que otro hilo está ejecutando un método en el objeto original?
Lo que pasa es que se vuelva a escribir el código para sincronizar adecuadamente el acceso a estos campos.