2013-10-15 20 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

是的,我確定了歡呼聲。 –

相關問題