Invalidar uma referência de objecto enquanto outro fio está a executar um método em que (.NET)
-
18-09-2019 - |
Pergunta
(Estou interessado no .NET CLR)
O que exatamente acontece quando um fio muda o objeto de referências de variáveis ??enquanto outra thread está executando um método no objeto original?
Por exemplo, digamos que o tipo Foo
tem uma variável 'Bar' do tipo Bar
e Bar
não tem estado em nível de classe (pelo menos por agora, eu gostaria de manter este simples cenário):
// Thread 1
foo.Bar = new Bar();
foo.Bar.SomeMethod();
Entretanto, antes que esta termina a execução ...
// Thread 2
foo.Bar = new Bar();
O que acontece com o método que é (era?) Executando em Thread 1? É tudo o que precisa para completar já na pilha?
Isso muda as coisas se rosca 2 faz isso em vez?
foo.Bar = null;
Solução
Se a chamada é garantido para já estar SomeMethod()
dentro, então nada de anormal vai acontecer - this
é um argumento implícito para os métodos, para que ele nunca usaria o valor do campo (ou a propriedade, seja ele qual for) diretamente
Se você pode realmente garantir que é outra questão.
Outras dicas
- edit:. Corrigido frase confundindo
Bem, na verdade atribuindo à variável será atômica, por isso não é como a chamada de repente perceber 'oh meu Eu sou nulo!' durante a execução .SomeMethod ()
O pode acontecer, porém, é que foo.Bar.SomeMethod () em si não será chamado, porque Thread 2 terá (talvez) defini-lo como nulo em primeiro lugar; por isso só não vai executar (ele irá falhar com uma exceção nula ref).
Mesmo se aplica com o primeiro exemplo; ele só vai chamar .SomeMethod sobre o novo objeto.
Eu acho que você está pensando as coisas podem mudar, enquanto .SomeMethod está funcionando, certo? Não. Nada vai mudar para lá. Ele ainda terá o contexto de si mesmo.
O que exatamente acontece quando um fio muda o objeto de referências de variáveis ??enquanto outra thread está executando um método no objeto original?
O que acontece é que você reescrever seu código para acessar corretamente sincronizar a estes campos.