2013-05-10 48 views
-3

我有以下靜態類。 規則是一種自定義類型。請確認這種方法對於我傳遞給每個生成靜態函數的規則的變量listToUpdate是線程安全的。是我的代碼中的可變線程安全列表<T>

public static class RulesBO 
{ 
    public static List<Rule> GetRulesForTransaction(int transID) 
    { 
     List<Rule> toReturn = new List<Rule>(); 
     GetRulesForSetA(transID,toReturn); 
     GetRulesForSetB(transID,toReturn); 
    } 

    public static void GetRulesForSetA(int transID, List<Rule> listToUpdate) 
    { 
     /*business logic and finally add/remove elements from listToUpdate*/ 

    } 

    public static void GetRulesForSetB(int transID, List<Rule> listToUpdate) 
    { 
     /*business logic and finally add/remove elements from listToUpdate*/ 

    } 
} 

謝謝您的幫助

編輯: 類RulesBO將從ASP.NET被調用。因此,對於每個會話,對於用戶的transactionID,將調用GetRulesForTransaction方法來返回規則列表。

每個GetRulesForSetXYZ將爲特定的transID進行數據庫調用,獲取一些值,執行一些檢查,如<> 100,> 1000等,然後向該變量添加一個新的RULE實例。其他方法將是私人的,只有第一種方法是公開的。

+0

這裏沒有同步 - 這肯定是**不是線程安全的。 – Oded 2013-05-10 17:33:37

+2

[你稱之爲線程安全的東西是什麼?](http://blogs.msdn.com/b/ericlippert/archive/2009/10/19/what-is-this-thing-you-call-thread-safe .aspx)您需要具體說明您正在執行的操作以及您期望的操作。鑑於此,您的代碼可能會或可能不會滿足您的期望。目前我們不知道你的代碼在做什麼,也不知道你期望它做什麼。 – Servy 2013-05-10 17:33:51

+1

簡答題:不。列表本身不是線程安全的。但是你並沒有在這裏執行任何異步或任何其他線程(從你展示的內容),所以它們都在同一個線程中。 – 2013-05-10 17:34:40

回答

1

既然你說:

每個GetRulesForSetXYZ [...]將是私人的,只有第一種方法是公開的。

這意味着,即使入口方法是從幾個不同的線程同時調用,每個調用都有它自己的列表。這些列表中的每一個都只能從單個線程訪問(至少在它們返回之前),因此您沒有任何多線程訪問權限進行同步,所以不存在競爭條件的可能性。

+0

謝謝您確認Servy。 – SainathDK 2013-05-10 17:45:59

+0

但他的業務邏輯可能很容易使用線程不安全的方式使用列表。 – sylverfyre 2013-05-10 18:05:31

+0

@sylverfyre當然,該代碼與他向我們展示的代碼完全無關,也不會受到它的使用方式的任何影響。如果他的程序有問題,那麼這不是他向我們顯示的代碼的結果。 – Servy 2013-05-10 18:06:37