- Qualcuno può spiegare la sicurezza di inizializzazione come richiesto dal modello di memoria Java?
- In che modo i campi final aiutano a raggiungere la sicurezza di inizializzazione ?
- Che ruolo ha il costruttore nell'assicurazione della sicurezza di inizializzazione ?
risposta
La sicurezza di inizializzazione consente a un oggetto di essere visto da una filettatura esterna nel suo stato completamente costruito (inizializzato). Il prerequisito è che l'oggetto non debba essere pubblicato prematuramente, ad es. nel suo costruttore. Una volta assicurato, JMM richiede determinati comportamenti per i campi dichiarati come final
. In primo luogo, tutti i final
campi di oggetto sono garantito per essere visto da una filettatura esterna nel suo stato completamente inizializzato - questo non è così banale come sembra -
consideri una classe
class A{
List list ;
A() {
list = Arrays.asList(some init expressions that adds 10 elements to list);
}
}
Un filo che accede al list
dell'istanza di A
non è garantito per impostazione predefinita di vedere 10 elementi in tale elenco. In effetti, questo thread può anche vedere list
come null
. Tuttavia, se list
viene dichiarato final
, quindi, come richiesto da JMM, lo list
deve essere sempre inizializzato con 10 elementi.
In secondo luogo, questa garanzia di inizializzazione non è limitata al campo final
, ma viene estesa in modo ricorsivo a tutti gli oggetti a cui si riferisce. Ad esempio, se lo list
nell'esempio precedente è un elenco di list
s, allora il thread esterno è garantito per vedere gli elenchi interni completamente inizializzati.
Si noti che da nessuna parte stiamo usando synchronized
per ottenere questa sicurezza nella visibilità della memoria (rapporto prima-accade).
1. sicurezza inizializzazione consente costruito in modo corretto oggetti immutabili da condividere salvo attraverso fili senza usare la sincronizzazione, indipendentemente anche se pubblicati utilizzando una corsa dati.
2. oggetti aventi campo finale, sicurezza inizializzazione impediscono riordino qualsiasi parte di costruzione con il carico iniziale di un riferimento a tale oggetto.
"indipendentemente dal fatto che abbiano pubblicato utilizzando una corsa di dati". Questa linea non ha alcun senso. Gli oggetti non sono pubblicati utilizzando le gare di dati :-). – Inquisitive
Non sono sicuro di "impedire il riordino di qualsiasi parte della costruzione". Le garanzie per i campi finali diventano effettive solo per l'inizializzazione di quei campi finali, non di altre parti della costruzione. – axtavt
@axtavt è impedito effettivamente il riordino rendendo un campo volatile non definitivo. Quindi il punto 2 non è corretto secondo me. – Inquisitive
- 1. std :: shared_ptr filo di sicurezza ha spiegato
- 2. java riordino e la memoria modello
- 3. ManipulationMode spiegato
- 4. codice Ruby ha spiegato
- 5. Math.random() ha spiegato
- 6. Salvataggio di un modello nella memoria locale
- 7. Scala e modello di memoria Java
- 8. webapp2 reindirizzamento spiegato
- 9. Perché il nome "realm" e "principal" nella sicurezza Java EE?
- 10. Implementazione del modello di memoria Java?
- 11. L'offuscamento di un modello di sicurezza ha posto nella sicurezza della password?
- 12. Java: come ArrayList gestisce la memoria
- 13. Come spiegare l'ereditarietà multipla in Java
- 14. Cloud Foundry ha spiegato
- 15. Creazione di oggetti nella memoria dello stack in java?
- 16. H.264 codec spiegato
- 17. spiegare questo modello di codice corrispondenti
- 18. Come monitorare l'utilizzo della memoria dell'applicazione java nella finestra mobile
- 19. Java nella memoria SQL Tabella come struttura dati
- 20. Qualcuno può spiegare la dichiarazione di questi metodi generici java?
- 21. ajax nella sicurezza primavera
- 22. Come scaricare l'oggetto s3 direttamente nella memoria in java
- 23. Memoria dei token di sicurezza WIF
- 24. Sicurezza Heap memoria: Garbage Collection stringa
- 25. Java codice di sicurezza
- 26. Come interpretare hasPermission nella sicurezza di primavera?
- 27. Perché questo comportamento è consentito nel modello di memoria Java?
- 28. Spiegare la funzione bindbind()
- 29. sicurezza Discussione con il mucchio-memoria allocata
- 30. Modello di memoria Java: riordinamento e blocchi simultanei
+1 per aver menzionato che la sicurezza di inizializzazione non solo garantisce la sicurezza per i campi finali ma anche per gli oggetti a cui fanno riferimento i campi finali. – Inquisitive