2012-04-13 65 views
2

在一個公共靜態類我有以下的本地方法:靜態方法之間的調用 - 是否會襯托線程安全?

private static int GetMaxFromList(IEnumerable<int> list) 
    { 
     var result = 0; 

     foreach (var i in list) 
     { 
      if (i > result) result = i; 
     } 

     return result; 
    } 

此方法由一些公共方法的類(例如)中調用:

public static bool IsIntegrityOfDataSetGood(DataSet dataSet, KeyValuePair<string, List<int>> tableAndColumnIndexes) 
    { 
     return IsIntegrityOfDataSetGood(dataSet, tableAndColumnIndexes.Key) && 
       dataSet.Tables[tableAndColumnIndexes.Key].Columns.Count > GetMaxFromList(tableAndColumnIndexes.Value); 
    } 

注意,此公共方法也稱班內另一種公共方法。

類方法只能通過參數發送給他們的數據,但我擔心靜態方法之間的調用會擾亂線程安全。我有權擔心嗎?

忘了提及這段代碼駐留在.NET 2.0項目中。

+0

僅當靜態方法訪問(靜態)對象/方法不是線程安全的,但正如您所提到的,您的方法僅使用提供給它的列表。如果在調用期間提供的'list'('tableAndColumnIndexes.Value')被改變,則可能會出現問題。 – 2012-04-13 07:26:37

+0

btw,另請參閱:'tableAndColumnIndexes.Value.Max()' - 不需要GetMaxFromList方法 – 2012-04-13 07:27:31

+4

線程安全是* entire *程序的* global *屬性。你不能看單獨的方法,並決定它們中的每一個都是線程安全的,並斷定整個程序是線程安全的。你不能看單個磚塊,發現它們都不是空洞的,並且認爲由磚塊製成的房子也不會是空洞的。 – 2012-04-13 17:09:35

回答

4

不,這將不是箔你的線程安全。

但是否它確實是線程安全的取決於tableAndColumnIndexes來自哪裏以及其他線程有權訪問它。換句話說,它取決於調用代碼。

3

只要沒有其他線程正在更改list序列,它應該是絕對好的。它不訪問任何共享狀態 - 它只是使用它的參數。如果其他線程修改序列,您將得到一個InvalidOperationException

聽起來你可能對線程安全和靜態方法有一些誤解,但很難準確地說出它們是什麼......你可能會發現Eric Lippert的博文"What is this thing you call thread safe?"有用。

+0

謝謝,我想我同意這種誤解;-)關於DefaultIfEmpty(),該項目運行在.NET 2.0上。 – JustAnotherCoder 2012-04-13 07:35:56

+0

@JustAnotherCoder:Ick - 好吧。 (可能值得一提的是,在未來的問題中,順便說一句......雖然在這種情況下它只是切線)。我已經編輯了一些我的答案。 – 2012-04-13 07:42:05

+0

我同意,並LINQ提示都贊同。 – JustAnotherCoder 2012-04-13 07:48:25