Аннулирование ссылки на объект, когда другой поток выполняет метод на нем (.NET)
(Меня интересует .NET CLR)
Что именно происходит, когда один поток изменяет объект, на который ссылается переменная, в то время как другой поток выполняет метод на исходном объекте?
Например, предположим, что тип Foo
имеет переменную ' Bar ' типа Bar
, а Bar
не имеет состояния уровня класса (по крайней мере, сейчас я хотел бы сохранить этот сценарий простым):
// Thread 1
foo.Bar = new Bar();
foo.Bar.SomeMethod();
В то же время, прежде чем это завершит выполнение ...
// Thread 2
foo.Bar = new Bar();
Что происходит с методом, который является (был?) выполнение в потоке 1? Есть ли все, что нужно для завершения уже в стеке?
Изменится ли ситуация, если поток 2 сделает это вместо этого?
foo.Bar = null;
3 ответа:
Если вызов гарантированно уже находится внутри
Можете ли вы действительно гарантировать это-другой вопрос.SomeMethod()
, то ничего необычного не произойдет -this
является неявным аргументом для методов, поэтому он никогда не будет использовать значение поля (или свойства, каким бы оно ни было) напрямую.
-- edit: исправлено сбивающее с толку предложение.
Ну, на самом деле присвоение переменной будет атомарным, так что это не похоже на то, что вызов внезапно поймет :" о боже, я нулевой!- во время казни .SomeMethod ()
То, что может произойти, - это фу.Бар.SomeMethod() сам по себе не будет вызван, потому что поток 2 сначала (возможно) установит его в null; поэтому он просто не будет выполняться (он будет аварийно завершаться с нулевым ref-исключением).
То же самое относится и к вашему первому примеру. вызов.Что-то похожее на новый объект.
Я думаю, ты думаешь, что все может измениться .Какой-то метод работает, верно? № Там ничего не изменится. Он все еще будет иметь контекст самого себя.