Ответ
Модификатор volatile используется для переменных, к которым обращаются из нескольких потоков. Он гарантирует видимость изменений и запрещает переупорядочивание операций с этой переменной, но не обеспечивает атомарность составных операций.
Используйте volatile в следующих случаях:
-
Флаги состояния для управления потоками. Простой и эффективный способ остановки потока.
public class WorkerThread { private volatile boolean running = true; public void run() { while (running) { /* выполняем работу */ } } public void stop() { running = false; } // Изменение видно всем потокам } -
Публикация неизменяемых (immutable) объектов. Если объект полностью сконструирован и не будет меняться, ссылку на него можно безопасно опубликовать через
volatileполе.public class Publisher { private volatile ImmutableConfig config; public void updateConfig(ImmutableConfig newConfig) { this.config = newConfig; // Безопасная публикация } } -
Одиночные операции записи. Когда переменная записывается одним потоком, а читается многими, и операция записи атомарна сама по себе (например, присваивание
int,long,reference).
Когда volatile НЕ подходит:
- Для операций типа check-then-act (проверить, затем изменить).
- Для составных операций, таких как инкремент (
i++).
В этих случаях требуются synchronized, Lock или атомарные классы (AtomicInteger, AtomicReference).