2010-01-04 105 views
1

我已經在MSDN論壇上提出了一個問題,但得到了兩個相反的答案。一般來說,我會介紹線程如何與靜態類一起工作。如果我的代碼同時從10個線程調用此(下)靜態方法,它是否線程安全?我的意思是,代碼如何在幕後流動?每個線程是否都在自己內部執行代碼(就像我認爲它與非靜態類一樣),或者它與靜態方法不同,並且因爲它的靜態,所有線程都試圖訪問代碼併發生衝突?謝謝!靜態方法和線程

public static class A 
{ 

    static void Method(object parameter) 
    { 
     SqlCeConnection = ..... 
    } 
} 

鏈接到MSDN問題:Here

PS:我很抱歉,由於IE瀏覽器頁面錯誤,我不能點擊「添加評論」或「答案」,喬恩斯基特答案是很好的(如一般:)

+0

請發佈msdn論壇鏈接或讓我們知道是什麼答案 – 2010-01-04 10:01:23

+1

看到了鏈接 - 我認爲他們不是兩個相反的答案。第一個人說'它會異步運行(同時)「。這是對的。但是,如果沒有同步,你的結果將會錯誤。第二個人說,'他們會執行相同的代碼'(他只是不同步說) – 2010-01-04 10:23:52

回答

6

它與非靜態類完全相同。靜態不影響任何事情 - 除了靜態方法通常是預計是線程安全的。他們不是自動線程安全的,但你應該確保你以線程安全的方式實現它們。

如果代碼不使用任何共享狀態,應該沒問題。是的,沒有任何鎖定,所有的線程可以同時執行相同的方法。

0

一個很好的例子可以是單例模式。在這一切你需要的是給定類的單個實例,並且可以通過使構造函數是私有的並給出靜態方法或屬性來訪問該實例來確保。片段突出相同: -

class MyClass 
{ 
private MyClass() 
{ 

} 

public static MyClass Instance 
{ 
    get 
    { 
     lock(typeof(MyClass)) 
     { 
      if(__instance == null) 
       __instance = new MyClass(); 
     } 
     return __instance; 
    } 
} 

}

由於「實例」方法標記靜態(線程一致的訪問),但在您需要manully照顧它的多線程envoirnment(用鎖) 。