Invalidación de una referencia de objeto, mientras que otro hilo está ejecutando un método en ella (NET)

StackOverflow https://stackoverflow.com/questions/1290873

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;
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top