2012-04-13 5 views
2

In einer öffentlichen statischen Klasse haben die folgende lokale Methode:Rufe zwischen statischen Methoden - wird das die Sicherheit von Folienfäden verbessern? Ich

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

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

     return result; 
    } 

Diese Methode wird von einigen der öffentlichen Methoden innerhalb der Klasse (Beispiel) genannt wird:

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

Beachten Sie, dass diese öffentliche Methode ruft auch eine andere öffentliche Methode innerhalb der Klasse auf.

Die Klassenmethoden funktionieren nur mit Daten, die über Parameter an sie gesendet werden, aber ich bin besorgt, dass die Aufrufe zwischen den statischen Methoden die Threadsicherheit durcheinander bringen. Habe ich recht, mir Sorgen zu machen?

Vergessen Sie zu erwähnen, dass sich dieser Code in einem .NET 2.0-Projekt befindet.

+0

Nur wenn die statischen Methoden auf (statische) Objekte/Methoden zugreifen, die nicht threadsicher sind, aber wie Sie erwähnen, verwendet die Methode nur die Liste, die ihr zur Verfügung gestellt wird. Ein Problem könnte auftreten, wenn die angegebene 'liste' (' tableAndColumnIndexes.Value') während des Aufrufs geändert wird. –

+0

BTW, siehe auch: 'tableAndColumnIndexes.Value.Max()' - keine Notwendigkeit für Ihre 'GetMaxFromList' Methode –

+4

Thread-Sicherheit ist eine * globale * Eigenschaft des * gesamten * Programms. Sie können nicht einzelne Methoden betrachten und entscheiden, dass jeder von ihnen threadsafe ist und schlussfolgern, dass das ganze Programm threadsafe ist. Man kann nicht einzelne Ziegel betrachten, entdecken, dass keine von ihnen hohl sind, und schlussfolgern, dass das aus diesen Ziegeln gebaute Haus auch nicht hohl sein wird. –

Antwort

4

Nein, dies wird nicht Folie Ihre Thread-Sicherheit.

Ob es tatsächlich threadsicher ist, hängt davon ab, woher stammt und welche anderen Threads darauf zugreifen können. Mit anderen Worten, es hängt vom aufrufenden Code ab.

3

Solange keine anderen Threads die list Sequenz ändern, sollte es absolut in Ordnung sein. Es greift nicht auf einen freigegebenen Zustand zu - es verwendet nur seinen Parameter. Wenn ein anderer Thread ist und Sie die Sequenz ändern, erhalten Sie eine InvalidOperationException.

Es klingt wie Sie einige Missverständnisse über Thread-Sicherheit und statische Methoden haben, aber es ist schwer zu sagen, was sie genau sind ... Sie finden Eric Lipperts Blogpost "What is this thing you call thread safe?" nützlich.

+0

Danke, und ich denke, ich stimme den Missverständnissen zu ;-) Über DefaultIfEmpty() läuft das Projekt auf .NET 2.0. – JustAnotherCoder

+0

@JustAnotherCoder: Ick - okay. (Es ist wahrscheinlich erwähnenswert, dass in zukünftigen Fragen, btw ... obwohl es in diesem Fall nur tangential war.) Ich habe dieses Stück von meiner Antwort bearbeitet. –

+0

Ich stimme zu, und der LINQ-Tipp wurde trotzdem geschätzt. – JustAnotherCoder

Verwandte Themen