0

我的代碼被AJAX UI(多線程)調用,並在Json中發送輸出數據處理。最近在重構代碼的時候,我們將很多常用的和重複的方法都轉移到了一個單獨的文件中,因爲我們沒有處理任何靜態/共享數據。 以下是一個樣本設計我們的靜態方法:通過多線程調用靜態方法 - 它們可以干涉對方的輸入參數

public class Helper 
{ 
    public static C Method1(List<A> aList, List<B> bList) 
    { 
     C objC = new C(); 

     // Create ObjC based on inputs aList and bList 

     return objC; 
    } 
} 

現在,我的理解是,下面的調用將沒有任何問題,在Parallel.foreach或任何其他多線程的情況下調用時,請確認。

C resultC = Helper.Method1(aList, bList); 

然而我們有疑問,能有一種罕見的情況下可能的,其中兩個線程使上述呼叫和ALIST,bList的一個線程數據被另一線程所取代,從而得到有缺陷的結果(可以是例外),因爲兩個線程必須在精確的毫秒內一起運行/執行,這種方法需要執行

請分享您的觀點我們在正確的軌道上創建上面提到的設計或有我們無法看到的坑。我們可以很容易地通過實例方法來替換,在這種情況下它們肯定是線程安全的,因爲每個線程都有自己的實例可以使用,但是我覺得可能並不需要它,並且在創建實例時很麻煩,因爲我們可以方便地使用一個靜態的調用。

請注意直到現在我還沒有看到代碼運行的問題,但正如我所說如果這種情況發生,它將是角落的情況下,兩個線程來同時和一個線程替換輸入參數,而其他線程仍然處理結果。

+0

每個調用都有自己的線程 – 2015-02-06 08:41:09

+0

調用該方法應該沒有什麼區別,如何使用它* may *,如果'resultC'被用作靜態變量,那麼可能會發生。 – Sayse 2015-02-06 08:41:34

+4

*參數*對於多線程來說不是問題,*您傳遞給這些參數的可能是*,但是我們無法從您的示例中知道這一點。意思是,如果你在不同的線程上傳遞相同的列表對象給兩個這樣的方法調用,那麼是的,你會遇到問題,但不是因爲參數本身。 – 2015-02-06 08:42:33

回答

4

對於您的問題的簡短回答是,只要您在所有不同的主題中傳遞不同List實例。 .NET可以很好地處理線程,並且本身不會讓自己陷入混亂,只有當您的代碼鼓勵它這樣做時纔會變得麻煩。

事情混淆的方式是通過共享狀態跨越不同的線程。因此,作爲一個例子,有一個靜態方法,你可能會認爲它使用的地方靜態變量是一個好主意:

private static int count; 

public static void MyMethod() { 
    count = count + 1; 
    if(count == 5) { 
     console.log("Equal to 5"); 
    } 
}; 

這種排序方法是線程安全的,因爲count可以通過兩個不同的線程在修改同一時間。實際上,count可能會增加到5,然後另一個線程在檢查if之前將其增加到6,因此您永遠不會記錄任何內容 - 這顯然會有點混亂。

您可以分享狀態的另一種方式是如果您傳遞某些內容,因此我會在答案的開頭提出警告。如果您將同一個對象從多個線程傳遞到方法中,則該對象理想情況下應該是immutable,因此在您的情況下,無法修改該集合。這可以防止方法的內部修改可能影響另一個線程的對象。如前所述,如果您在不同線程中傳遞相同的實例,這只是一個問題。

+0

感謝您的詳細解答,它確實說明了我的疑問。我正在考慮創建不同對象並將其傳遞給靜態方法的問題。我不修改靜態方法內的任何靜態數據類型 – 2015-02-06 12:55:55

0

方法調用不會干擾來自不同線程的其他方法調用。你必須仔細考慮靜態變量。此外,如果您在線程之間共享輸入參數aList或bList,則可能會遇到麻煩。

相關問題