【发布时间】:2012-11-20 19:22:03
【问题描述】:
在阅读了来自 msdn 的 Jon Skeet article 和 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?
我已经搜索了很多关于这个主题的内容,找不到找到 任何文章,其中指出:不同的线程、引用类型和值类型.. .)
【问题讨论】:
-
调用线程代码如何创建类?
-
@asawyer 只在 main 中运行了 3 次
ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork ),null); -
@RoyiNamir 在上面一行中,目标实例每次都是
this- 实际上是new WaitCallback(this.DoWork)。因此,如果您的代码执行 3 次,则可以:它们是针对同一实例的 3 个委托,因此mp和g是共享的但请注意我所说的不一定会观察到更改除非您使用内存屏障(同步)或volatile访问。由于非常复杂的原因。 -
@MarcGravell 但
writing不需要内存屏障/锁定/易失性。正确的 ?只读...? -
@RoyiNamir 取决于很多因素;例如,虽然是:所有写入都实现为 volatile 写入,但这是一个不应该使用的实现细节(在执行线程语义时,您关心的是保证,并且:is' t)。此外,它取决于数据大小:
int、float等,加上引用保证是原子写入;但是大型结构(包括double和long)不保证是原子写入。对于原语,Interlocked很方便;但除此之外:您肯定需要同步以避免损坏值。
标签: c# .net multithreading stack