(我感兴趣的.NET CLR)

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

举例来说,假设类型Foo具有类型Bar的变量“酒吧”,和Bar没有类电平状态(至少目前,我想保持这种情况下简单):

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

在此期间,在此之前完成执行...

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

恰好在线程1执行该被(状态?)的方法是什么?一切都需要在栈上已经完成?

它是否在改变的事情,如果线程2做到这一点呢?

foo.Bar = null;
有帮助吗?

解决方案

如果呼叫保证已经在里面SomeMethod(),再没有什么异常情况发生 - this是方法的隐含参数,所以它永远不会直接使用的字段(或属性,无论它是)的值

无论你才能真正保证那是另一回事。

其他提示

- 编辑:校正混乱句子

嗯,其实赋给变量将是不可分割的,因此它不像通话会突然意识到“哦,我,我空!”在执行.SomeMethod()

什么的可以的发生,虽然是foo.Bar.SomeMethod()本身不会被调用,因为线程2将有(也许)将其设置为第一个空;所以它只是将不执行(它会与空REF例外崩溃)。

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

我觉得你的想法,而.SomeMethod运行事情可能会改变,对不对?号什么都不会在那里发生改变。它仍然具有其自身的上下文。

  

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

什么情况是,你重写代码正确同步访问这些字段。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top