Eine Thread-sichere Sammlung im Vergleich zu einer Nicht-Thread-Sammlung kann auf andere Weise betrachtet werden.
Betrachten Sie ein Geschäft ohne Verkäufer, außer an der Kasse. Sie haben eine Menge Probleme, wenn Menschen nicht verantwortungsvoll handeln. Nehmen wir an, ein Kunde nimmt eine Dose aus einer Pyramidendose, während ein Angestellter gerade die Pyramide baut, die Hölle würde sich lösen. Oder, wenn zwei Kunden gleichzeitig nach dem gleichen Gegenstand greifen, wer gewinnt? Wird es einen Kampf geben? Dies ist eine Nicht-Thread-Safe-Sammlung. Es gibt viele Möglichkeiten, Probleme zu vermeiden, aber sie alle erfordern eine Art von Sperren oder vielmehr expliziten Zugriff auf die eine oder andere Weise.
Auf der anderen Seite, betrachten Sie ein Geschäft mit einem Angestellten an einem Schreibtisch, und Sie können nur durch ihn einkaufen. Du reihst dich ein und fragst ihn nach einem Gegenstand, er bringt ihn zurück und du gehst aus der Reihe. Wenn Sie mehrere Gegenstände benötigen, können Sie bei jeder Rundfahrt nur so viele Gegenstände aufnehmen, wie Sie sich erinnern können, aber Sie müssen vorsichtig sein, um den Verkäufer nicht zu nerven, dies wird die anderen Kunden in der Schlange hinter Ihnen verärgern.
Nun betrachten Sie dies. In dem Geschäft mit einem Angestellten, was ist, wenn Sie den ganzen Weg zur Vorderseite der Linie gehen, und fragen Sie den Angestellten "Haben Sie Toilettenpapier", und er sagt "Ja", und dann gehen Sie "Ok, ich" Ich melde mich bei Ihnen, wenn ich weiß, wie viel ich brauche ", und wenn Sie wieder an vorderster Front stehen, kann der Laden natürlich ausverkauft sein. Dieses Szenario wird nicht durch eine threadsafe-Sammlung verhindert.
Eine threadsafe-Sammlung garantiert, dass ihre internen Datenstrukturen immer gültig sind, selbst wenn von mehreren Threads aus zugegriffen wird.
Eine nicht fadensichere Sammlung wird nicht mit solchen Garantien geliefert. Wenn Sie zum Beispiel etwas zu einem Binärbaum in einem Thread hinzufügen, während ein anderer Thread damit beschäftigt ist, den Baum wieder auszugleichen, gibt es keine Garantie dafür, dass das Element hinzugefügt wird, oder sogar, dass der Baum danach noch gültig ist.
Eine THREAD Sammlung jedoch nicht garantieren, dass die aufeinander folgenden Operationen auf dem Thread alle Arbeiten auf dem gleichen „Momentaufnahme“ der internen Datenstruktur, was bedeutet, dass, wenn Sie Code wie folgt:
if (tree.Count > 0)
Debug.WriteLine(tree.First().ToString());
Sie könnten eine NullReferenceException erhalten, weil zwischen tree.Count
und tree.First()
ein anderer Thread die verbleibenden Knoten in der Struktur gelöscht hat, was bedeutet, dass First()
null
zurückgibt.
Für dieses Szenario müssen Sie entweder sehen, ob die fragliche Sammlung einen sicheren Weg hat, um zu bekommen, was Sie wollen, vielleicht müssen Sie den obigen Code neu schreiben, oder Sie müssen möglicherweise sperren.
Möglicherweise möchten Sie sehen [diesen Code Projekt Artikel zu diesem Thema] (http: //www.codeproject.com/Articles/548406/Dictionary-plus-Locking-versus-ConcurrentDictionar) – nawfal