Optymalizacja oraz zmienne volatile
W przypadku braku synchronizacji kompilator, środowisko uruchomieniowe oraz kompilator mogą dokonywać optymalizacji na kodzie. Optymalizacje te mogą wprowadzać nieoczekiwane błędy.
Wyobraźmy sobie sytuację, w której dwa wątki zostają uruchomione na dwóch różnych procesorach. Dodatkowo pierwszy wątek pisze do zmiennej, przy czym drugi czyta wartości z tej samej zmiennej.
Każdy z wątków kopiuje wartość zmiennej z pamięci głównej do pamięci cache procesora dla ulepszenia wydajności. JVM nie definiuje momentu, w którym wartości te zostaną ponownie zapisane do pamięci głównej z pamięci cache.