Lesenswert
26.05.2014, 00:00 Uhr
Thread Safe sollte verboten werden
Immer wenn mehrere Threads auf eine Variable zugreifen, kann es zu Inkonsistenzen kommen. Selbst Typen, die als Thread Safe gelten, sind nicht sicher.
Der Terminus Thread Safe hat sich im Zuge das Multithreading für Konstrukte durchgesetzt, bei denen ein gleichzeitiger Zugriff von mehreren Threads kein Problem darstellt. Alles ist fein, denn eine Variable dieses Typs enthält immer den richtigen Wert.
Dass dem nicht so ist, zeigt ein kleines Beispiel von von Jared Parsons:
static object GetFirstOrDefault(ArrayList synchronizedList) {
if (synchronizedList.Count > 0) {
return synchronizedList[0];
}
return null;
}
Obwohl in dem Beispiel ArrayList als Thread Safe gilt, alle Zeilen eine korrekte Verwendung von ArrayList darstellen, ist das Schnipsel doch alles andere als Thread Safe. Der Grund: Eine beliebige Anzahl an Threads kann den aktuellen Thread in dem Augenblick unterbrechen, in dem dieser sich gerade in dem if-Statement befindet. Er kann alle Elemente der Liste löschen und es gibt eine wunderschöne Exception.
Parsons schlägt verschiedene andere Bezeichnungen vor, die wesentlich genauer wiedergeben, was ein Typ tatsächlich sicherstellt.
Data Race Free
Dieser Typ wird immer den korrekten inneren Wert wiedergeben egal, wieviele Threads laufen und auf den Typ zugreifen.
Multiple Reader, Single Writer
Dieses Pattern kommt häufig vor. Beliebig viele Threads können Daten aus dem Speicher lesen, solange diese während des Lesens sich nicht verändern. Nur ein Thread darf den Wert im Speicher verändern.
Thread Affinity
Dieser Typ kann nur von einem einzigen Thread angesprochen werden. Jeder Zugriff eines anderen Threads führt zu einer Exception.
Not Even Read Safe
LINQ-Queries gehören hierzu: Diese Typen sind schlicht unsicher. Ein IEnumerable wird erst ausgeführt, wenn tatsächlich Daten angefordert werden. Diese können aber durch einen anderen Thread schon verändert sein.
Immutable Types
Das ist die einzige Klasse, bei der die Bezeichnung Thread Safe tatsächlich passt: Einmal gesetzt ist so ein Typ unveränderlich, sprich keiner der Threads kann ihn verändern. Damit können alles auch seinen Wert zu jeder Zeit lesen.
Parsons liefert noch weitere Erläuterungen unter http://blog.paranoidcoding.com/2014/05/22/ban-the-term-thread-safe.html. [tib]