2012-04-13 13 views
2

私は次のローカルメソッドを持っているパブリック静的クラスで:このパブリックメソッドその静的メソッド間の呼び出し - スレッドの安全性を脅かすでしょうか?

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); 
    } 

注:このメソッドは、クラス内のパブリックメソッドの一部(例えば)によって呼び出され

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

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

     return result; 
    } 

クラス内の別のパブリックメソッドを呼び出します。

クラスメソッドは、パラメータを介して送信されたデータでのみ動作しますが、静的メソッド間の呼び出しによってスレッドの安全性が損なわれることが懸念されます。私は心配する権利はありますか?

このコードは、.NET 2.0プロジェクトに存在します。

+0

スレッドセーフではないが静的メソッド(静的)オブジェクト/メソッドにアクセスする場合のみ、あなたが言及しているとおり、メソッドはそれに提供されているリストのみを使用します。呼び出し中に提供される 'list '(' tableAndColumnIndexes.Value')が変更された場合、問題が発生する可能性があります。 –

+0

btw、 'tableAndColumnIndexes.Value.Max()'も参照してください。 'GetMaxFromList'メソッドは不要です。 –

+4

スレッドセーフは、* whole *プログラムの*グローバル*プロパティです。個々のメソッドを見て、スレッドセーフであると判断し、プログラム全体がスレッドセーフであると判断することはできません。あなたは個々のレンガを見ることはできません、それらのどれも中空ではないことを発見し、それらのレンガから作られた家も空ではないと結論づけます。 –

答えて

4

いいえ、これはではありません。はあなたのスレッドの安全を守ります。

しかし、本当にスレッドセーフであるかどうかは、tableAndColumnIndexesがどこから来ているのか、ほかのどのスレッドがアクセスできるのかによって異なります。言い換えれば、それは呼び出しコードに依存します。

3

他のスレッドがlistシーケンスを変更していない限り、それは絶対に良いはずです。それは共有状態にはアクセスせず、パラメータを使用するだけです。他のスレッドの場合、InvalidOperationExceptionとなります。

スレッドの安全性と静的メソッドについて誤解を感じるかもしれませんが、正確には何かを伝えるのは難しいです...あなたはEric Lippertのブログ投稿"What is this thing you call thread safe?"が役に立ちます。

+0

ありがとう、私は誤解について同意すると思います;-) DefaultIfEmpty()については、プロジェクトは.NET 2.0で動作します。 – JustAnotherCoder

+0

@JustAnotherCoder:Ick - 大丈夫です。 (これはおそらく将来の質問では、btwと言及する価値があります...このケースでは接線であったにもかかわらず)私は私の答えからそのビットを編集しました。 –

+0

私は同意し、LINQのヒントはすべて同じように評価されました。 – JustAnotherCoder

関連する問題