MS Link:Der Hyperlink-Login ist sichtbar.
Das flüchtige Schlüsselwort gibt an, dass ein Feld von mehreren gleichzeitig ausgeführten Threads modifiziert werden kann. Als flüchtig deklarierte Felder sind nicht durch Compiler-Optimierung eingeschränkt (vorausgesetzt, sie werden von einem einzelnen Thread abgerufen). Dies stellt sicher, dass das Feld jederzeit mit dem aktuellsten Wert gerendert wird.
Der flüchtige Modifikator wird typischerweise für Felder verwendet, die von mehreren Threads abgerufen werden, aber den Zugriff nicht mit einer Lock-Anweisung serialisieren.
Flüchtige Schlüsselwörter können auf die folgenden Feldtypen angewendet werden:
- Zitationstyp.
- Zeigertyp (in einem unsicheren Kontext). Beachte, dass der Zeiger selbst zwar veränderbar sein kann, das Objekt, auf das er zeigt, jedoch nicht veränderbar sein kann. Mit anderen Worten: "Zeiger auf ein veränderliches Objekt" kann nicht deklariert werden.
- Typen wie sbyte, byte, short, ushort, int, uint, char, float und bool.
- Ein Enum-Typ mit einem der folgenden Basistypen: Byte, Sbyte, Short, ushort, int oder Uint.
- Generische Typparameter, die als Referenztypen bekannt sind.
- IntPtr und UIntPtr.
Variable Schlüsselwörter können nur auf Felder einer Klasse oder Struktur angewendet werden.Lokale Variablen können nicht als flüchtig deklariert werden。
Kein Unsinn mehr, schreibe eine Schleife, um es zu testen:
Testen wir es 10.000 Mal in einer Schleife,stellte fest, dass die Ausgabe von a-Werten korrekt ist, aber,Es erklärt das nichtVolatile ist threadsicherDenn wenn man es mehrfach testet, stellt man fest, dass es zu Berechnungsfehlern kommt! Weil es eine Chance auf ein korrektes Ergebnis und eine Chance auf ein falsches Ergebnis gibt
Code:
Testen wir erneut 100.000 Schleifen, und wir können feststellen, dass der Wert von a falsch ist, denn je kleiner die Anzahl der Schleifen, desto geringer ist die Fehlerwahrscheinlichkeit, und der Fehler ist nicht so offensichtlich, genauso wie es nach 10.000 Schleifen gerade keinen Fehler gab.
An diesem Punkt fügen wir eine Sperre zum Testen hinzu, und es ist zu sehen, dass der Wert von a korrekt berechnet wird, wie wir es erwartet haben.
Code:
Zusammenfassung: Volatile garantiert keine Thread-Sicherheit, wie du im obigen Beispiel sehen kannst.
|