Qualcuno può spiegare cosa significano i modificatori transient
e volatile
in Java?
Qualcuno può spiegare cosa significano i modificatori transient
e volatile
in Java?
Risposte:
I modificatori volatile
e transient
possono essere applicati ai campi delle classi 1 indipendentemente dal tipo di campo. A parte questo, non sono collegati.
Il transient
modificatore indica al sottosistema di serializzazione dell'oggetto Java di escludere il campo durante la serializzazione di un'istanza della classe. Quando l'oggetto viene quindi deserializzato, il campo verrà inizializzato sul valore predefinito; vale null
a dire per un tipo di riferimento e zero o false
per un tipo primitivo. Si noti che JLS (vedere 8.3.1.3 ) non dice cosa transient
significa, ma si discosta dalle specifiche di serializzazione degli oggetti Java . Altri meccanismi di serializzazione possono prestare attenzione all'intensità di un campo transient
. Oppure possono ignorarlo.
(Si noti che JLS consente static
di dichiarare un campo come transient
. Questa combinazione non ha senso per la serializzazione di oggetti Java, poiché non serializza comunque la statica. Tuttavia, potrebbe avere senso in altri contesti, quindi esiste una giustificazione per non vietarlo del tutto.)
Il volatile
modificatore dice alla JVM che le scritture sul campo devono sempre essere scaricate in modo sincrono nella memoria e che le letture del campo devono sempre leggere dalla memoria. Ciò significa che i campi contrassegnati come volatili sono accessibili e aggiornati in modo sicuro in un'applicazione multi-thread senza utilizzare la sincronizzazione nativa o standard basata su libreria. Allo stesso modo, legge e scrive in campi volatili sono atomici. (Ciò non si applica a >> non volatili << long
o double
campi, che possono essere soggetti a "strappo di parole" su alcune JVM.) Le parti rilevanti di JLS sono 8.3.1.4 , 17.4 e 17.7 .
1 - Ma non alle variabili o ai parametri locali.
volatile
e transient
parole chiave
1) la transient
parola chiave viene utilizzata insieme alle variabili di istanza per escluderle dal processo di serializzazione. Se un campo è il transient
suo valore non sarà persistente.
D'altra parte, la volatile
parola chiave viene utilizzata per contrassegnare una variabile Java come "archiviata nella memoria principale".
Ogni lettura di una volatile
variabile verrà letta dalla memoria principale del computer e non dalla cache della CPU e che ogni scrittura su una volatile
variabile verrà scritta nella memoria principale e non solo nella cache della CPU.
2) la transient
parola chiave non può essere utilizzata insieme alla static
parola chiave ma volatile
può essere utilizzata insieme a static
.
3) le transient
variabili vengono inizializzate con il valore predefinito durante la deserializzazione e l'assegnazione o il ripristino del valore deve essere gestito dal codice dell'applicazione.
Per ulteriori informazioni, consultare il mio blog:
http://javaexplorer03.blogspot.in/2015/07/difference-between-volatile-and.html
transient
variabile non può essere utilizzata insieme alla static
parola chiave è che le variabili statiche appartengono a una classe e non a nessuna singola istanza. Il concetto di serializzazione riguarda lo stato corrente dell'oggetto. Solo i dati associati a un'istanza specifica di una classe sono serializzati, pertanto i campi dei membri statici vengono ignorati durante la serializzazione
static
e transient
di essere utilizzato insieme. Il problema è che ha poco senso, perché i tipici meccanismi di serializzazione non persistono comunque nella statica.
Volatile significa che altri thread possono modificare quella particolare variabile. Quindi il compilatore consente di accedervi.
http://www.javamex.com/tutorials/synchronization_volatile.shtml
Transitorio significa che quando si serializza un oggetto, questo restituirà il suo valore predefinito in caso di deserializzazione
Transitorio:
Innanzitutto è necessario sapere dove era necessario come colmare il divario.
1) Un transitorio modificatore di accesso è applicabile solo al componente variabile. Non verrà utilizzato con metodo o classe.
2) Non è possibile utilizzare una parola chiave temporanea insieme a una parola chiave statica.
3) Cos'è la serializzazione e dove viene utilizzata? La serializzazione è il processo per rendere persistente lo stato dell'oggetto. Ciò significa che lo stato dell'oggetto viene convertito in un flusso di byte da utilizzare per persistere (ad es. Memorizzazione di byte in un file) o trasferimento (ad es. Invio di byte attraverso una rete). Allo stesso modo, possiamo usare la deserializzazione per riportare lo stato dell'oggetto dai byte. Questo è uno dei concetti importanti nella programmazione Java poiché la serializzazione viene utilizzata principalmente nella programmazione in rete. Gli oggetti che devono essere trasmessi attraverso la rete devono essere convertiti in byte. Prima di comprendere la parola chiave transitoria, è necessario comprendere il concetto di serializzazione. Se il lettore è a conoscenza della serializzazione, saltare il primo punto.
Nota 1) Il transitorio viene utilizzato principalmente per il processo di serializzazione. Per questo la classe deve implementare l'interfaccia java.io.Serializable. Tutti i campi della classe devono essere serializzabili. Se un campo non è serializzabile, deve essere contrassegnato come transitorio.
Nota 2) Quando si verifica un processo deserializzato, vengono impostati sul valore predefinito: zero, falso o null secondo il vincolo di tipo.
Nota 3) Parola chiave transitoria e relativo scopo? Un campo dichiarato con modificatore transitorio non prenderà parte al processo serializzato. Quando un oggetto viene serializzato (salvato in qualsiasi stato), i valori dei suoi campi transitori vengono ignorati nella rappresentazione seriale, mentre il campo diverso dai campi transitori prenderà parte al processo di serializzazione. Questo è lo scopo principale della parola chiave transitoria.