Kann jemand erklären, was die transient
und volatile
Modifikatoren in Java bedeuten?
Kann jemand erklären, was die transient
und volatile
Modifikatoren in Java bedeuten?
Antworten:
Die Modifikatoren volatile
und transient
können unabhängig vom Feldtyp auf Felder der Klasse 1 angewendet werden . Abgesehen davon sind sie nicht miteinander verbunden.
Der transient
Modifikator 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 null
für einen Referenztyp und Null oder false
für einen primitiven Typ. Beachten Sie, dass das JLS (siehe 8.3.1.3 ) nicht sagt, was transient
bedeutet, 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 static
Deklaration 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 volatile
Modifikator 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 << long
oder double
Felder, 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.
volatile
und transient
Schlüsselwörter
1) Das transient
Schlüsselwort wird zusammen mit Instanzvariablen verwendet, um sie vom Serialisierungsprozess auszuschließen. Wenn ein Feld ist, wird transient
sein Wert nicht beibehalten.
Andererseits wird das volatile
Schlüsselwort verwendet, um eine Java-Variable als "im Hauptspeicher gespeichert" zu markieren.
Jeder Lesevorgang einer volatile
Variablen wird aus dem Hauptspeicher des Computers und nicht aus dem CPU-Cache gelesen, und jeder Schreibvorgang in eine volatile
Variable wird in den Hauptspeicher und nicht nur in den CPU-Cache geschrieben.
2) transient
Schlüsselwort kann nicht zusammen mit static
Schlüsselwort verwendet werden, volatile
kann aber zusammen mit verwendet werden static
.
3) transient
Variablen 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
transient
Variable nicht zusammen mit dem static
Schlü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
static
und transient
darf zusammen verwendet werden. Das Problem ist, dass es wenig Sinn macht, da typische Serialisierungsmechanismen die Statik sowieso nicht beibehalten.
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
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.