2013-10-15 67 views
1

看看这里:当线程运行相同的方法时,为什么值不会发生冲突?

static void Main(string[] args) 
{ 
    test p = new test(); 

    new Thread(() => p.SayHello("Thread One")).Start(); 
    new Thread(() => p.SayHello("Thread Two")).Start(); 
} 

则:

class test 
{ 
    public void SayHello(string data) 
    { 
     int i = 0; 

     while (i < 50) 
     { 
      Console.WriteLine("Hello from " + data); 
      i++; 
     } 
    } 
} 

为什么第二个线程不会重置变量i为0?并弄乱它在第一个线程上运行的while循环?

+0

同步调用这些方法并没有什么不同。当一个线程(任何线程)进入方法时,局部变量只能在方法中使用。如果它们被吊起来,那么它就变成另一个故事了。 –

回答

5

这是因为int i是一个局部变量。如果你把它变成静态的而不是本地变量,它将被重置。在这种情况下,变量被隔离到每个线程。

实施例:

static void Main(string[] args) 
{ 
    test p = new test(); 

    new Thread(() => p.SayHello("Thread One")).Start(); 
    new Thread(() => p.SayHello("Thread Two")).Start(); 
} 

public class test 
{ 
    static int i = 0; 
    public static void SayHello(string data) 
    { 
     i = 0; 

     while (i < 50) 
     { 
      Console.WriteLine("Hello from " + data); 
      i++; 
     } 
    } 
} 
+1

第一句话在这里是正确的 - 但是然后你开始谈论实例变量,当没有任何...时有点混淆,如果'i' *是一个实例变量,因为只有一个实例,所以会有问题。 –

+0

@JonSkeet谢谢,我修好了。这更准确吗? – Codeman

+0

是的,那样更好。 –

5

i是一个局部变量,所以每个线程有其自己的i副本。

0

把它看作是每个线程都将SayHello方法与其局部变量进行“复制”。如果你希望两个线程都使用同一个我,你必须通过引用来传递它,然后乐趣就会开始。

+1

也许你的意思是“通过参考”? –

+0

'int'是通过值传递的,所以你必须明确指定'ref'才能实现这一点。 – Codeman

+0

是的,我确定了欢呼声。 –

相关问题