在C#中进行线程化,值类型和引用类型澄清?

时间:2012-12-03 10:31:12

标签: c# .net multithreading stack

在阅读了Jon Skeet article和msdn的this文章之后,我仍然有一个问题

假设我有这段代码:

  MyPerson mp = new MyPerson(); //Field

  int g=0; //Field

  public void DoWork ()
   {
      int i;
      MyPerson mp2 = new MyPerson();  
      ...
   }

现在让我说我有2个帖子。运行DoWork。 (现在让我们忽略,竞争条件)

  • 他们是否会看到相同的g或每个帖子都有自己的项目? ? (值)

  • 他们是否会看到相同的mp或者每个帖子都有自己的项目? (实例)

  • 他们是否会看到相同的i或每个帖子都有自己的项目? (值)

  • 他们是否会看到相同的mp2或每个帖子都有自己的项目? (实例)

  • 如果他们都看到相同的话,我为什么需要static

我搜索了很多关于这个主题的内容,无法找到任何文章,其中说明了:不同的主题,参考类型和价值类型。 。)

2 个答案:

答案 0 :(得分:13)

两个线程都没有"运行DoWork&#34 ;;他们在特定对象上运行DoWork 。如果针对不同的实例创建了两个线程,则mpg将是完全独立的字段。如果针对相同实例创建了两个主题,则mpg将共享,但不保证线程会看到除非您使用同步或volatile访问权限,否则其他线程所做的更改。

例如:

var obj = new SomeObject();
Thread thread1 = new Thread(obj.DoWork);
Thread thread2 = new Thread(obj.DoWork); // clearly targeting the same instance

VS

var obj = new SomeObject();
Thread thread1 = new Thread(obj.DoWork);
obj = new SomeObject();
Thread thread2 = new Thread(obj.DoWork); // targeting a different instance

局部变量imp2严格针对每个线程。

附加说明:即使它们是单独的字段/本地,如果...中的某些代码稍后重新分配mpmp2以引用相同的对象< / em>,然后他们将在同一个物体上争吵;相同的同步/ volatile规则将适用。

答案 1 :(得分:3)

变量gmp对于包含类是“全局的”,因此它们将是两个线程看到的相同对象。 i是在DoWork事件中声明的局部变量;随后这只会对后台/替代线程“可见”。

他们没有'看到'相同,所以在这种情况下static关键字没有相关性。

我希望这会有所帮助。