在另一个线程正在其上执行方法时使对象引用无效(.NET)

时间:2009-08-17 22:38:32

标签: .net multithreading synchronization race-condition

(我对.NET CLR感兴趣)

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

例如,假设类型FooBar类型的变量'Bar',而Bar没有类级别状态(至少现在,我是喜欢保持这种情况简单):

// Thread 1
foo.Bar = new Bar();
foo.Bar.SomeMethod();

与此同时,在此之前完成......

// Thread 2
foo.Bar = new Bar();

在线程1上执行(是?)的方法会发生什么?是否需要在堆栈中完成所有内容?

如果线程2改为这样做会改变吗?

foo.Bar = null;

3 个答案:

答案 0 :(得分:3)

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

你能否真正保证这是另一回事。

答案 1 :(得分:1)

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

嗯,实际上分配给变量将是原子的,所以它并不像调用会突然意识到'哦,我的我是空的!'在执行.SomeMethod()

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

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

我认为你认为事情可能会改变.SomeMethod正在运行,对吗?不,那里什么都不会改变。它仍然具有自身的背景。

答案 2 :(得分:-1)

  

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

您会重写代码以正确同步对这些字段的访问权限。