Czytałem ten answer w końcu z których następujące napisane:preferując zsynchronizowane z lotnym
Wszystko, co można z lotnym można zrobić z zsynchronizowane, ale nie odwrotnie.
Nie jest jasne. JLS 8.3.1.4 definiuje pola lotnych następująco:
Pole może być uznana za lotny, w którym to przypadku Java pamięci model zapewnia, że wszystkie wątki zobaczyć spójne wartość dla zmiennej (§17.4).
Tak więc, zmienne pola dotyczą widoczności pamięci. Ponadto, o ile dostałem odpowiedzi, którą cytowałem, czytanie i pisanie na zmienne pola są zsynchronizowane.
Synchronizacja gwarantuje, że tylko jeden wątek ma dostęp do zsynchronizowanego bloku. Jak mam, nie ma to nic wspólnego z widocznością pamięci. Co mnie ominęło?
Wejście i wyjście z bloku "zsynchronizowanego" wykonuje barierę pamięci, zapewniając, że zmiany są widoczne w wątkach. – Sneftel