gpt4 book ai didi

c# - C# 中的线程、值类型和引用类型说明?

转载 作者:太空狗 更新时间:2023-10-29 17:39:21 25 4
gpt4 key购买 nike

阅读 Jon Skeet 后 article , 和 this文章来自msdn,我还有一个问题

假设我有这段代码:

  MyPerson mp = new MyPerson(); //Field

int g=0; //Field

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

现在假设我有 2 个线程。它运行 DoWork。 (让我们暂时忽略,竞争条件)

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

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

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

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

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

我搜索了很多关于这个主题的内容,但无法找到任何文章指出:不同的线程、ref 类型和值类型.. .)

最佳答案

两个线程都没有简单地“运行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

对比

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 引用同一个对象,那么他们就会为同一个对象争吵;将应用相同的同步/volatile 规则。

关于c# - C# 中的线程、值类型和引用类型说明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13681356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com