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

Roy*_*mir 9 .net c# stack multithreading

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

假设我有这段代码:

  MyPerson mp = new MyPerson(); //Field

  int g=0; //Field

  public void DoWork ()
   {
      int i;
      MyPerson mp2 = new MyPerson();  
      ...
   }
Run Code Online (Sandbox Code Playgroud)

现在让我们说我有两个主题.哪个运行DoWork.(现在让我们忽略,竞争条件)

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

  • 他们都会看到相同mp 或每个线程都有自己的项目?? (实例)

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

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

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

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

Mar*_*ell 13

这两个线程都没有"运行DoWork"; 他们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
Run Code Online (Sandbox Code Playgroud)

VS

var obj = new SomeObject();
Thread thread1 = new Thread(obj.DoWork);
obj = new SomeObject();
Thread thread2 = new Thread(obj.DoWork); // targeting a different instance
Run Code Online (Sandbox Code Playgroud)

局部变量i并且mp2严格地针对每个线程.

附加说明:即使它们是单独的字段/本地人,如果一些代码在...后来重新分配mpmp2指代相同的对象,则它们将被争吵在同一对象; 相同的同步/ volatile规则将适用.