加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

线程在C#,值类型和引用类型澄清?

发布时间:2020-12-15 06:57:46 所属栏目:百科 来源:网络整理
导读:在阅读Jon Skeet article和 this的msdn文章后,我还有一个问题 假设我有这个代码: MyPerson mp = new MyPerson(); //Field int g=0; //Field public void DoWork () { int i; MyPerson mp2 = new MyPerson(); ... } 现在我说两个线程.它运行DoWork. (现在我
在阅读Jon Skeet article和 this的msdn文章后,我还有一个问题

假设我有这个代码:

MyPerson mp = new MyPerson(); //Field

  int g=0; //Field

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

现在我说两个线程.它运行DoWork. (现在我们忽略竞争条件)

>他们会看到同样的g或者每个线程都会有自己的项目? ? (价值)
>他们都会看到同样的mp或每个线程将有自己的项目? (实例)
>他们会看到相同的我还是每个线程都会有自己的项目? (价值)
>他们都会看到相同的mp2或者每个线程都会有自己的项目? (实例)
>如果他们都看到相同的,为什么我需要静态?

我搜索了很多关于这个话题,找不到任何文章说:不同的线程,引用类型和值类型…)

解决方法

线程都不是简单地“运行DoWork”;他们在特定对象上运行DoWork.如果创建了两个线程来针对不同的实例,那么mp和g将是完全独立的字段.如果针对同一个实例创建了两个线程,那么mp和g将被共享,但不能保证线程将看到另一个线程所做的更改,除非您使用同步或易失性访问.

例如:

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

局部变量i和mp2是严格针对每个线程的.

附加注意:即使它们是单独的字段/本地,如果…中的某些代码稍后重新分配mp或mp2来引用相同的对象,那么它们将在同一对象上争吵;相同的同步/不规则规则将适用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读