2016-12-26 3 views
0

Ich weiß, statische Variable oder Sammlung ist freigegeben, über die Threads, höchstens einzelne Speicheradresse für Variable erstellt wird, und es ist Zustand wird, über die Threads.Sperrmechanismus ist für statische Liste oder Variablen erforderlich?

static int count = 0

Thread 1 -> count ++

Gewinde 2 -> diplay Zahl -> 1

Gewinde 3 -> count--

Thread 1 -> Anzeige Anzahl -> 0

meine Frage, Sperrmechanismus ist für statische Sammlungen erforderlich? Unten ist der statische Sammel- und Verriegelungsmechanismus.

public static List<ConnectionManager> ServerConnections = new List<ConnectionManager>(); 
lock (Global.ServerConnections) 
{ 
//do something 
} 

Antwort

0

Die Antwort ist: Ja. Sie benötigen eine Sperre, da Static! = Thread safe. Dies gilt auch für Ihre count Variable.

Nur weil eine Variable statisch ist, ist sie nicht threadsicher. Mehrere Threads können immer noch genau zur selben Zeit darauf zugreifen, was zu Problemen mit dem gemeinsamen Zugriff führt.

Es gibt standardmäßig keine Thread-Sicherheit, es muss Thread-sicher ausgeführt werden.

Werfen Sie auch einen Blick auf die ConcurrentBag<T>.

0

Sicher. Wenn Sie nur Threadsicherheit benötigen, können Sie C# gleichzeitige Sammlungen verwenden, aber wenn Sie eine Synchronisierung wünschen (wie mehrere Aktionen bei einer Sammlung innerhalb eines Threads, die ohne Auswirkungen anderer Threads ausgeführt werden), müssen Sie sperren.

Eigentlich müssen Sie auch auf Ihre Variablen achten, count++ und count-- sind nicht threadsicher. Verwenden Sie Interlocked oder einen anderen Mechanismus, um die Sicherheit des Gewindes zu gewährleisten.

0

Es gehört zu, wie Sie die Sammlung verwenden und wie Sie sie installieren. Wenn Sie es aus verschiedenen Threads instanziieren, sollten Sie sicherstellen, dass nur ein Thread es installiert. Denn mit Badluck versuchen mehrere Threads gleichzeitig. Die in .Net implementierte Klasse Lazy dient diesem Zweck und macht es einfach, Thread-sicher und faul zu instanziieren. Weiter müssen Sie Ihre Sammlung in jedem Fall der Operation sperren, die Sie tun möchten. Einfügen, Entfernen, Iterieren usw. sind alle nicht threadsicher. Weitere Informationen zu Threadsafe-Sammlungen finden Sie unter concurrentDictionary usw.

Verwandte Themen