Heim  >  Artikel  >  Java  >  Die Funktionen und Unterschiede zwischen den Schlüsselwörtern volatile und synchronisiert in Java

Die Funktionen und Unterschiede zwischen den Schlüsselwörtern volatile und synchronisiert in Java

巴扎黑
巴扎黑Original
2017-06-26 10:20:181622Durchsuche

volatile ist ein variabler Modifikator, während synchronisiert auf einen Codeabschnitt oder eine Methode einwirkt ; die folgenden drei erhalten Methodencodes:

1 int i1;2 int geti1() {return i1;}3 4 volatile int i2;5 int geti2() {return i2;}6 7 int i3;8 synchronized int geti3() {return i3;}

geti1() ruft den im aktuellen Thread gespeicherten Wert von i1 ab. Mehrere Threads verfügen über mehrere Kopien der i1-Variablen, und diese i1s können sich voneinander unterscheiden. Mit anderen Worten: Möglicherweise hat ein anderer Thread den i1-Wert in seinem Thread geändert, und dieser Wert unterscheidet sich möglicherweise vom i1-Wert im aktuellen Thread. Im Java-Speichermodell gibt es einen Hauptspeicher (Hauptspeicherbereich), in dem der aktuelle „genaue Wert“ von Variablen gespeichert wird. Jeder Thread verfügt außerdem über einen eigenen Speicher (z. B. Register). Aus Leistungsgründen behält ein Thread eine Kopie der Variablen, auf die er zugreift, in seinem eigenen Speicher. Auf diese Weise kann es zu Situationen kommen, in denen der Wert derselben Variablen im Speicher eines Threads zu einem bestimmten Zeitpunkt möglicherweise nicht mit dem Wert des Speichers eines anderen Threads oder dem Wert des Hauptspeichers übereinstimmt. Daher gibt es tatsächlich eine Möglichkeit: Der Wert von i1 im Hauptspeicher ist 1, der Wert von i1 in Thread 1 ist 2 und der Wert von i1 in Thread 2 ist 3. Dadurch ändern sich ihre jeweiligen i1-Werte in beiden Threads 1 und Thread 2. Und diese Änderung erfolgt, bevor sie an den Hauptspeicher oder andere Threads übergeben werden kann.

geti2() ruft den i2-Wert des Hauptspeichers ab. Das Deklarieren einer Variablen als flüchtig bedeutet, dass die Variable jederzeit von anderen Threads geändert wird und daher nicht im Thread-Speicher zwischengespeichert werden kann. Mit anderen Worten: Nachdem eine Variable flüchtig geändert wurde, muss sie in allen Threads synchronisiert werden. Wenn ein Thread seinen Wert ändert, erhalten alle anderen Threads sofort denselben Wert. Daher verbrauchen flüchtig geänderte Variablen beim Zugriff auf sie etwas mehr Ressourcen als normale Variablen, da es für den Thread effizienter ist, über eine eigene Kopie der Variablen zu verfügen.

Die geti3()-Methode wird durch synchronisiert geändert. Wenn synchronisiert zum Ändern einer Methode oder eines Codeabschnitts verwendet wird, kann garantiert werden, dass höchstens ein Thread den Code gleichzeitig ausführen kann. Da das Schlüsselwort volatile bereits eine Datensynchronisierung zwischen Threads erreicht hat, warum muss es synchronisiert werden? Wenn zwei gleichzeitige Threads auf den synchronisierten (diesen) Synchronisationscode im selben Objektobjekt zugreifen, kann jeweils nur ein Thread ausgeführt werden. Ein anderer Thread muss warten, bis der aktuelle Thread die Ausführung dieses Codeblocks abgeschlossen hat, bevor er diesen Codeblock ausführen kann. Wenn jedoch ein Thread auf einen synchronisierten (diesen) synchronisierten Codeblock des Objekts zugreift, kann ein anderer Thread weiterhin auf den nicht synchronisierten (diesen) synchronisierten Codeblock im Objekt zugreifen. Besonders kritisch ist, dass, wenn ein Thread auf einen synchronisierten (diesen) synchronisierten Codeblock des Objekts zugreift, der Zugriff anderer Threads auf alle anderen synchronisierten (diesen) synchronisierten Codeblöcke des Objekts blockiert wird. Wenn ein Thread auf einen synchronisierten (diesen) synchronisierten Codeblock eines Objekts zugreift, erhält er die Objektsperre dieses Objekts. Dadurch wird der Zugriff anderer Threads auf alle synchronisierten Codeteile des Objekts vorübergehend blockiert.

Um die Unterschiede zusammenzufassen :

Erstens ist „volatile“ ein Variablenmodifikator, während „synchonized“ auf einen Codeabschnitt oder eine Methode einwirkt.

Zweitens synchronisiert volatile nur den Wert einer Variablen zwischen Thread-Speicher und Hauptspeicher (Hauptspeicher); synchronisiert synchronisiert den Wert aller Variablen durch Sperren und Entsperren eines Monitors. Offensichtlich verbraucht synchronisiert mehr Ressourcen als flüchtig.

Das obige ist der detaillierte Inhalt vonDie Funktionen und Unterschiede zwischen den Schlüsselwörtern volatile und synchronisiert in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Java-SpeicherzuweisungNächster Artikel:Java-Speicherzuweisung