3

(我对 .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;
4

3 回答 3

3

如果保证调用已经在 inside SomeMethod(),那么不会发生任何异常 -this是方法的隐式参数,因此它永远不会直接使用字段(或属性,无论它是什么)的值。

能不能真正保证是另外一回事。

于 2009-08-17T22:45:11.283 回答
1

-- 编辑:更正了令人困惑的句子。

好吧,实际上分配给变量将是原子的,所以调用不会突然意识到“哦,我的我是空的!” 在执行 .SomeMethod() 时

但是,可能发生的是foo.Bar.SomeMethod () 本身不会被调用,因为线程 2 将(可能)首先将其设置为 null;所以它不会执行(它会因空引用异常而崩溃)。

同样适用于您的第一个示例;它只会在新对象上调用 .SomeMethod 。

我认为您认为 .SomeMethod 正在运行时情况可能会发生变化,对吗?不,那里什么都不会改变。它仍然具有自身的上下文。

于 2009-08-17T22:42:07.590 回答
-1

当一个线程更改变量引用的对象而另一个线程正在对原始对象执行方法时,究竟会发生什么?

发生的情况是您重写代码以正确同步对这些字段的访问。

于 2009-08-17T23:01:09.440 回答