我的代碼被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的一個線程數據被另一線程所取代,從而得到有缺陷的結果(可以是例外),因爲兩個線程必須在精確的毫秒內一起運行/執行,這種方法需要執行
請分享您的觀點我們在正確的軌道上創建上面提到的設計或有我們無法看到的坑。我們可以很容易地通過實例方法來替換,在這種情況下它們肯定是線程安全的,因爲每個線程都有自己的實例可以使用,但是我覺得可能並不需要它,並且在創建實例時很麻煩,因爲我們可以方便地使用一個靜態的調用。
請注意直到現在我還沒有看到代碼運行的問題,但正如我所說如果這種情況發生,它將是角落的情況下,兩個線程來同時和一個線程替換輸入參數,而其他線程仍然處理結果。
每個調用都有自己的線程 – 2015-02-06 08:41:09
調用該方法應該沒有什麼區別,如何使用它* may *,如果'resultC'被用作靜態變量,那麼可能會發生。 – Sayse 2015-02-06 08:41:34
*參數*對於多線程來說不是問題,*您傳遞給這些參數的可能是*,但是我們無法從您的示例中知道這一點。意思是,如果你在不同的線程上傳遞相同的列表對象給兩個這樣的方法調用,那麼是的,你會遇到問題,但不是因爲參數本身。 – 2015-02-06 08:42:33