Аннулирование ссылки на объект, когда другой поток выполняет метод на нем (.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 3

3 ответа:

Если вызов гарантированно уже находится внутри SomeMethod(), то ничего необычного не произойдет - this является неявным аргументом для методов, поэтому он никогда не будет использовать значение поля (или свойства, каким бы оно ни было) напрямую.

Можете ли вы действительно гарантировать это-другой вопрос.

-- edit: исправлено сбивающее с толку предложение.

Ну, на самом деле присвоение переменной будет атомарным, так что это не похоже на то, что вызов внезапно поймет :" о боже, я нулевой!- во время казни .SomeMethod ()

То, что может произойти, - это фу.Бар.SomeMethod() сам по себе не будет вызван, потому что поток 2 сначала (возможно) установит его в null; поэтому он просто не будет выполняться (он будет аварийно завершаться с нулевым ref-исключением).

То же самое относится и к вашему первому примеру. вызов.Что-то похожее на новый объект.

Я думаю, ты думаешь, что все может измениться .Какой-то метод работает, верно? № Там ничего не изменится. Он все еще будет иметь контекст самого себя.

Что именно происходит, когда один поток изменяет объект, на который ссылается переменная, в то время как другой поток выполняет метод на исходном объекте?

Происходит следующее: вы переписываете код, чтобы правильно синхронизировать доступ к этим полям.