Слайд 2JLS гарантирует, что чтение-запись переменных примитивных типов кроме long, double – атомарно
Синхронизация

необходима для надежной коммуникации между потоками, и для взаимного исключения
Атомарно – не значит синхронизированно
Слайд 3Hoisting optimization (для не синхронизированных переменных):

Слайд 4Недостаточно синхронизировать только чтение или только запись

Слайд 5Менее громоздкое исправление

Слайд 6++ - не атомарный оператор. На самом деле это ДВЕ операции: прочитать

значение, записать значение + 1
Можно исправить это добавив syncronized и убрав volatile
Но лучше так: