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

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top