Was sind transiente und flüchtige Modifikatoren?


126

Kann jemand erklären, was die transientund volatileModifikatoren in Java bedeuten?


3
Dies war eindeutig keine Frage und dies ist sowieso ein Duplikat (weshalb ich für den Abschluss gestimmt habe). Siehe zum Beispiel Warum hat Java transiente Variablen? und wann genau verwenden Sie das flüchtige Schlüsselwort in Java? (und die vielen anderen).
Pascal Thivent


18
Dies ist eine vollkommen gültige Frage, die entspricht: stackoverflow.com/questions/215497/…
Barry

Antworten:


156

Die Modifikatoren volatileund transientkönnen unabhängig vom Feldtyp auf Felder der Klasse 1 angewendet werden . Abgesehen davon sind sie nicht miteinander verbunden.

Der transientModifikator weist das Java-Objektserialisierungssubsystem an, das Feld beim Serialisieren einer Instanz der Klasse auszuschließen. Wenn das Objekt dann deserialisiert wird, wird das Feld auf den Standardwert initialisiert. dh nullfür einen Referenztyp und Null oder falsefür einen primitiven Typ. Beachten Sie, dass das JLS (siehe 8.3.1.3 ) nicht sagt, was transientbedeutet, sondern sich auf die Java Object Serialization Specification beschränkt . Andere Serialisierungsmechanismen können auf die Feldstärke achten transient. Oder sie ignorieren es.

(Beachten Sie, dass das JLS die staticDeklaration eines Felds als zulässt transient. Diese Kombination ist für die Java-Objektserialisierung nicht sinnvoll, da sie die Statik ohnehin nicht serialisiert. In anderen Kontexten kann sie jedoch sinnvoll sein, daher gibt es eine Rechtfertigung dafür nicht direkt verbieten.)

Der volatileModifikator teilt der JVM mit, dass Schreibvorgänge in das Feld immer synchron in den Speicher geleert werden sollen und dass Lesevorgänge des Feldes immer aus dem Speicher gelesen werden sollen. Dies bedeutet, dass auf Felder, die als flüchtig markiert sind, in einer Multithread-Anwendung sicher zugegriffen und aktualisiert werden kann, ohne dass eine native oder standardmäßige bibliotheksbasierte Synchronisation verwendet wird. In ähnlicher Weise sind Lese- und Schreibvorgänge in flüchtigen Feldern atomar. (Dies gilt nicht für >> nichtflüchtige << longoder doubleFelder, die bei einigen JVMs möglicherweise einem " Wortriss " unterliegen.) Die relevanten Teile des JLS sind 8.3.1.4 , 17.4 und 17.7 .


1 - Aber nicht auf lokale Variablen oder Parameter.


10

volatileund transientSchlüsselwörter

1) Das transientSchlüsselwort wird zusammen mit Instanzvariablen verwendet, um sie vom Serialisierungsprozess auszuschließen. Wenn ein Feld ist, wird transientsein Wert nicht beibehalten.

Andererseits wird das volatileSchlüsselwort verwendet, um eine Java-Variable als "im Hauptspeicher gespeichert" zu markieren.

Jeder Lesevorgang einer volatileVariablen wird aus dem Hauptspeicher des Computers und nicht aus dem CPU-Cache gelesen, und jeder Schreibvorgang in eine volatileVariable wird in den Hauptspeicher und nicht nur in den CPU-Cache geschrieben.

2) transientSchlüsselwort kann nicht zusammen mit staticSchlüsselwort verwendet werden, volatilekann aber zusammen mit verwendet werden static.

3) transientVariablen werden während der De-Serialisierung mit dem Standardwert initialisiert und dort muss die Zuweisung oder Wiederherstellung des Werts durch den Anwendungscode erfolgen.

Weitere Informationen finden Sie in meinem Blog:
http://javaexplorer03.blogspot.in/2015/07/difference-between-volatile-and.html


2
Der Grund, warum die transientVariable nicht zusammen mit dem staticSchlüsselwort verwendet werden kann, ist, dass statische Variablen zu einer Klasse und nicht zu einer einzelnen Instanz gehören. Das Konzept der Serialisierung befasst sich mit dem aktuellen Zustand des Objekts. Nur Daten, die einer bestimmten Instanz einer Klasse zugeordnet sind, werden serialisiert, daher werden statische Mitgliedsfelder während der Serialisierung ignoriert
Chaklader Asfak Arefe

Eigentlich erlaubt das JLS staticund transientdarf zusammen verwendet werden. Das Problem ist, dass es wenig Sinn macht, da typische Serialisierungsmechanismen die Statik sowieso nicht beibehalten.
Stephen C

7

Flüchtig bedeutet, dass andere Threads diese bestimmte Variable bearbeiten können. Der Compiler erlaubt also den Zugriff auf sie.

http://www.javamex.com/tutorials/synchronization_volatile.shtml

Transient bedeutet, dass beim Serialisieren eines Objekts bei der De-Serialisierung der Standardwert zurückgegeben wird

http://www.geekinterview.com/question_details/2


5
"Der Compiler erlaubt also den Zugriff auf sie." Ihr Satz deutet darauf hin, dass Threads standardmäßig keinen Zugriff haben. Jetzt lese ich den Link und die andere Antwort, die ich verstehe: Der Compiler führt keine threadspezifische Zwischenspeicherung der Variablen durch, damit andere Threads die Änderungen sofort sehen können.
Helios

Ich habe die C-Verwendung von flüchtigen und Java-Verwendung von flüchtigen verwirrt. Ich meinte, der Compiler stellt sicher, dass er Zugriff auf den Actaul-Wert des Felds hat und nicht auf einen zwischengespeicherten Wert.
Raynos

es bedeutet mehr als das.
Stephen C

1

Vorübergehend:

Zuerst muss man wissen, wo es gebraucht wird, wie es die Lücke schließt.

1) Ein Access-Modifikator-Transient gilt nur für variable Komponenten. Es wird nicht mit Methode oder Klasse verwendet.

2) Das vorübergehende Schlüsselwort kann nicht zusammen mit dem statischen Schlüsselwort verwendet werden.

3) Was ist Serialisierung und wo wird sie verwendet? Bei der Serialisierung wird der Status des Objekts dauerhaft gemacht. Dies bedeutet, dass der Status des Objekts in einen Bytestrom konvertiert wird, der zum Fortbestehen (z. B. Speichern von Bytes in einer Datei) oder zum Übertragen (z. B. Senden von Bytes über ein Netzwerk) verwendet wird. Auf die gleiche Weise können wir die Deserialisierung verwenden, um den Status des Objekts aus Bytes wiederherzustellen. Dies ist eines der wichtigsten Konzepte in der Java-Programmierung, da die Serialisierung hauptsächlich in der Netzwerkprogrammierung verwendet wird. Die Objekte, die über das Netzwerk übertragen werden müssen, müssen in Bytes konvertiert werden. Bevor man das vorübergehende Schlüsselwort versteht, muss man das Konzept der Serialisierung verstehen. Wenn der Leser etwas über Serialisierung weiß, überspringen Sie bitte den ersten Punkt.

Hinweis 1) Transient wird hauptsächlich für den Serialisierungsprozess verwendet. Dazu muss die Klasse die Schnittstelle java.io.Serializable implementieren. Alle Felder in der Klasse müssen serialisierbar sein. Wenn ein Feld nicht serialisierbar ist, muss es als vorübergehend markiert werden.

Hinweis 2) Wenn ein deserialisierter Prozess stattfindet, werden sie auf den Standardwert gesetzt - Null, Falsch oder Null gemäß Typbeschränkung.

Anmerkung 3) Transientes Schlüsselwort und sein Zweck? Ein Feld, das mit einem Transientenmodifikator deklariert wird, nimmt nicht am serialisierten Prozess teil. Wenn ein Objekt serialisiert wird (in einem beliebigen Zustand gespeichert), werden die Werte seiner Übergangsfelder in der seriellen Darstellung ignoriert, während das Feld außer den Übergangsfeldern am Serialisierungsprozess teilnimmt. Dies ist der Hauptzweck des vorübergehenden Schlüsselworts.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.