§66 Синхронизированный доступ к разделяемым mutable данным
JLS гарантирует, что чтение-запись переменных примитивных типов кроме long, double – атомарно Синхронизация необходима для надежной коммуникации между потоками, и для взаимного исключения Атомарно – не значит синхронизированно
Hoisting optimization (для не синхронизированных переменных):
Недостаточно синхронизировать только чтение или только запись
Менее громоздкое исправление
++ - не атомарный оператор. На самом деле это ДВЕ операции: прочитать значение, записать значение + 1 Можно исправить это добавив syncronized и убрав volatile Но лучше так:
Лучший способ избежать подобных проблем: не использовать общие не mutable данные Ограничивайте использование mutable данных внутри одного потока Если все же вы используете общие mutable данные каждый поток должен заботиться о синхронизации чтения/записи.