【Java】flüchtige detaillierte Erklärung

Das Schlüsselwort volatile verhindert die Neuordnung von Anweisungen und hat zwei Bedeutungen:

  1) Wenn das Programm eine Leseoperation oder eine Schreiboperation für eine flüchtige Variable ausführt, müssen alle Änderungen an den vorherigen Operationen durchgeführt worden sein und die Ergebnisse müssen für nachfolgende Operationen sichtbar sein; die nachfolgenden Operationen dürfen noch nicht ausgeführt worden sein ; 2)
  Bei der Befehlsoptimierung können weder Anweisungen, die auf flüchtige Variablen zugreifen, danach ausgeführt werden, noch können Anweisungen nach flüchtigen Variablen davor ausgeführt werden.


„Bei Betrachtung des Assemblercodes, der generiert wird, wenn das Schlüsselwort volatile hinzugefügt und nicht hinzugefügt wird, wird festgestellt, dass beim Hinzufügen des Schlüsselworts volatile eine zusätzliche Sperrpräfixanweisung vorhanden ist.“

  Die Sperrpräfixanweisung entspricht tatsächlich einer Speicherbarriere (auch Speicherzaun genannt). Die Speicherbarriere bietet drei Funktionen:

  1) Es stellt sicher, dass bei der Neuordnung von Anweisungen weder die folgenden Anweisungen vor der Speicherbarriere noch die vorherigen Anweisungen hinter der Speicherbarriere angeordnet werden, d. h. wenn die Anweisung der Speicherbarriere ausgeführt wird, darin Die Alle vorherigen Vorgänge wurden abgeschlossen.
  2) Dadurch wird erzwungen, dass der Änderungsvorgang im Cache sofort in den Hauptspeicher geschrieben wird.
  3) Wenn es sich um einen Schreibvorgang handelt, werden die entsprechenden Cache-Zeilen in anderen CPUs ungültig.


Das synchronisierte Schlüsselwort verhindert, dass mehrere Threads gleichzeitig einen Code ausführen, was sich stark auf die Effizienz der Programmausführung auswirkt. Das flüchtige Schlüsselwort hat in einigen Fällen eine bessere Leistung als synchronisiert, es ist jedoch zu beachten, dass das flüchtige Schlüsselwort das nicht ersetzen kann synchronisiertes Schlüsselwort. , da das flüchtige Schlüsselwort die Atomizität der Operation nicht garantieren kann. Im Allgemeinen müssen die folgenden zwei Bedingungen erfüllt sein, um flüchtig zu verwenden:

  1) Der Schreibvorgang auf die Variable hängt nicht vom aktuellen Wert ab.
  2) Die Variable ist nicht in einer Invariante mit anderen Variablen enthalten

  Tatsächlich zeigen diese Bedingungen an, dass die gültigen Werte, die in flüchtige Variablen geschrieben werden können, unabhängig von jedem Programmstatus sind, einschließlich des aktuellen Status der Variablen.
  Tatsächlich verstehe ich, dass die beiden oben genannten Bedingungen sicherstellen müssen, dass die Operation eine atomare Operation ist, um sicherzustellen, dass Programme, die das Schlüsselwort volatile verwenden, während der Parallelität korrekt ausgeführt werden können.

Guess you like

Origin blog.csdn.net/xudahai513/article/details/126904969