Invalider une référence d'objet et un autre fil est en cours d'exécution d'une méthode sur le (NET)

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

Question

(Je suis intéressé par le CLR .NET)

Qu'est-ce qui se passe exactement quand un thread change l'objet d'une référence variables, tandis qu'un autre thread exécute une méthode sur l'objet original?

Par exemple, supposons que le type Foo a une variable « Bar » du Bar type et Bar n'a pas d'état de niveau de classe (pour l'instant au moins, je voudrais garder ce scénario simple):

// Thread 1
foo.Bar = new Bar();
foo.Bar.SomeMethod();

En attendant, avant cette fin de l'exécution ...

// Thread 2
foo.Bar = new Bar();

Qu'est-ce qui se passe à la méthode qui est (était?) Sur l'exécution de cette discussion 1? Est-ce tout ce qu'il doit remplir déjà sur la pile?

-t-il changer les choses si le thread 2 le fait à la place?

foo.Bar = null;
Était-ce utile?

La solution

Si l'appel est garanti déjà à l'intérieur SomeMethod(), alors rien d'inhabituel va se passer - this est un argument implicite des méthodes, il ne serait jamais utiliser la valeur du champ (ou la propriété, quelle qu'elle soit) directement

Que vous pouvez vraiment garantir que est une autre affaire.

Autres conseils

.

- modifier: phrase confusion corrigée

Eh bien, en fait assigner à la variable sera atomique, il est donc pas comme l'appel réalisera tout à coup: «Oh mon retour, je suis nulle! lors de l'exécution .SomeMethod ()

Qu'est-ce que peut se produire, cependant, est que lui-même foo.Bar.SomeMethod () ne sera pas appelé, parce que cette discussion aura 2 (peut-être) mettre à NULL en premier lieu; donc il ne sera pas tout simplement exécuter (il se bloque avec une exception ref null).

La même chose vaut avec votre premier exemple; il vous reste plus qu'à appeler .SomeMethod sur le nouvel objet.

Je pense que vous pensez les choses peuvent changer en cours d'exécution tout en .SomeMethod est, non? Non. Rien ne changera là-dedans. Il aura encore le contexte de lui-même.

  

Qu'est-ce qui se passe exactement quand un thread change l'objet d'une référence variables, tandis qu'un autre thread exécute une méthode sur l'objet original?

Qu'est-ce qui se passe est que vous réécrivez votre code pour synchroniser correctement l'accès à ces champs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top