Cosa sono i modificatori transitori e volatili?


126

Qualcuno può spiegare cosa significano i modificatori transiente volatilein Java?


3
Questa chiaramente non era una domanda e questo è comunque un duplicato (motivo per cui ho votato per chiudere). Vedi ad esempio Perché Java ha variabili transitorie? e quando usi esattamente la parola chiave volatile in Java? (e molti altri).
Pascal Thivent,

possibile duplicato di Per cosa viene usato "volatile"?
Jeff,

18
Questa è una domanda perfettamente valido, equivalente a: stackoverflow.com/questions/215497/...
Barry Fruitman

Risposte:


156

I modificatori volatilee transientpossono essere applicati ai campi delle classi 1 indipendentemente dal tipo di campo. A parte questo, non sono collegati.

Il transientmodificatore 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 nulla dire per un tipo di riferimento e zero o falseper un tipo primitivo. Si noti che JLS (vedere 8.3.1.3 ) non dice cosa transientsignifica, 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 staticdi 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 volatilemodificatore 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 << longo doublecampi, 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.


10

volatilee transientparole chiave

1) la transientparola chiave viene utilizzata insieme alle variabili di istanza per escluderle dal processo di serializzazione. Se un campo è il transientsuo valore non sarà persistente.

D'altra parte, la volatileparola chiave viene utilizzata per contrassegnare una variabile Java come "archiviata nella memoria principale".

Ogni lettura di una volatilevariabile verrà letta dalla memoria principale del computer e non dalla cache della CPU e che ogni scrittura su una volatilevariabile verrà scritta nella memoria principale e non solo nella cache della CPU.

2) la transientparola chiave non può essere utilizzata insieme alla staticparola chiave ma volatilepuò essere utilizzata insieme a static.

3) le transientvariabili 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


2
Il motivo per cui la transientvariabile non può essere utilizzata insieme alla staticparola 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
Chaklader Asfak Arefe

In realtà, il JLS consente statice transientdi essere utilizzato insieme. Il problema è che ha poco senso, perché i tipici meccanismi di serializzazione non persistono comunque nella statica.
Stephen C,

7

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

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


5
"Quindi il compilatore consente di accedervi." La tua frase suggerisce che le discussioni non hanno accesso per impostazione predefinita. Ora leggo il link e l'altra risposta capisco: il compilatore non esegue alcun tipo di archiviazione intermedia specifica della discussione in modo che altri thread possano vedere le modifiche immediatamente.
helios,

Ho avuto l'uso C di uso volatile e java di volatile confuso. Intendevo che il compilatore assicura che abbia accesso al valore actaul del campo anziché a un valore memorizzato nella cache.
Raynos,

significa di più.
Stephen C,

1

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.