Пока ваши операции get / set ТОЛЬКО получают и устанавливают переменную, тогда все ваши предположения будут правильными.
В Java переменные хранятся в памяти. Но компилятор (и среда выполнения) позволяют временно хранить переменную в кэше ЦП, чтобы обеспечить более быстрое чтение и запись во время работы алгоритма или части кода.
Недостатком этого кэширования является то, что когда ядро завершает работу с переменной, оно записывает его обратно в память, как если бы оно было обновлено только один раз. Другие ядра не могут видеть состояние переменной во время ее использования. Что еще хуже, нет гарантии порядка относительно того, КОГДА он будет записан обратно в память.
Устанавливая переменную как Volatile, вы говорите java, что переменная не может быть помещена в ЛЮБОЙ кэши. Чтение или запись в переменную должны происходить в памяти.
Это означает, что Volatile будет выполнять отдельные операции над переменной atomi c. Но это также сделает длительные операции с переменной ОЧЕНЬ МЕДЛЕННЫМ. Так что volatile не является решением для увеличения производительности многопоточного кода.
Примечательно, что операция, требующая более одного чтения или записи, это , а не atomi c. Например, для i ++, который на самом деле равен i = i + 1, можно изменить значение i до завершения записи.
Если вам нужно гарантировать, что операции выполняются атомарно, вы можете использовать блокировку или полутекс (медленный) или Вы можете использовать умную парадигму, такую как Copy-On-Write (COW), чтобы разрешить чтение атомов ati c и запись атомов atom c.