2011-11-27 170 views
0

假設我有一類象下面這樣:執行在多線程靜態方法

public static class Foo 
{ 
    public static int Do(int original) 
    { 
     int result=original + 1; 
     return result; 
    } 
} 

public class Bar 
{ 
    public void Invoke() 
    { 
     int result=Foo.Do(1); 
    } 
} 

誰能告訴我如何在CLR被調用?我們只知道CLR是基於堆棧的虛擬機。調用Foo.Do()方法的實例有其自己的Call Stack。它將一個int arg推入Stack,然後調用Foo.Do()方法。我想知道多線程中的幾個實例是否會調用Foo.Do()會干擾其他人嗎?每個實例都有Foo.Do()的副本,或者更確切地說呢?

回答

1

每個線程都有自己的調用堆棧設置。因此,當您在一個線程中調用某個函數時,僅對該線程更改了堆棧。其他線程可以調用他們想要的任何其他函數,而不會相互影響(除了共享狀態,但這是另一個問題,重要的是堆棧不共享)。

1

我在woudering多線程中的幾個實例是否調用Foo.Do()會干擾對方?每個實例都有Foo.Do()的副本,或者更確切地說呢?

在這種情況下,每個實例都可以。在單獨的線程之間沒有數據共享,因爲InvokeFoo.Do不依賴任何其他共享狀態。

當您嘗試在各個線程之間共享數據時,會出現多線程的主要問題。此時,您需要注意同步訪問共享數據。

0

您應該看看API的ThreadLocal API,以便您可以擁有特定於線程的存儲。在你的情況下,由於裏德建議,它應該沒有問題,因爲沒有共享狀態,但如果有任何,這將是重要的靜態存儲線程之間共享,除非它是ThreadLocal