ho letto questo answer, alla fine del quale il seguente scritto:preferendo sincronizzati per volatili
Tutto ciò che è possibile con volatili può essere fatto con sincronizzato, ma non viceversa.
Non è chiaro. JLS 8.3.1.4 definisce campi volatili come segue:
Un campo può essere dichiarato volatile, nel qual caso la memoria Modello Java garantisce che tutte le discussioni vedono un valore coerente per la variabile (§17.4).
Quindi, i campi volatili riguardano la visibilità della memoria. Inoltre, per quanto ho ottenuto dalla risposta che ho citato, la lettura e la scrittura di campi volatili sono sincronizzati.
La sincronizzazione, a sua volta garantisce che l'unico thread abbia accesso a un blocco sincronizzato. Come ho ottenuto, non ha nulla a che fare con la visibilità della memoria. Cosa mi sono perso?
L'ingresso e l'uscita da un blocco 'sincronizzato' esegue una barriera di memoria, assicurando che le modifiche siano visibili attraverso i thread. – Sneftel