Зачем нужно volatile в Java

Многие разработчики Java, даже те, которые пишут на нём уже несколько лет, не знают, что делает ключевое слово volatile в Java.

Пример поля с volatile:

Использование volatile — это один из способов обеспечения согласованного доступа к переменной разными потоками. Более подробно о разработке многопоточных приложений в Java и синхронизации между потоками можно прочесть в моей статье про многопоточность в Java.

Ключевое слово volatile указывается для поля для того, чтобы указать компилятору, что все операции присвоения этой переменной и все операции чтения из неё должны быть атомарными.

Более того, присвоение значения этой переменной имеет связь happens-before (произошло-до) для последующих чтений из этой переменной для любых потоков, то есть после присвоения нового значения переменной все потоки увидят это новое значение. Дело в том, что Java позволяет потокам в целях производительности сохранять локальные копии переменной для каждого потока, который её использует (например в кешах или регистрах процессора). В таком случае после записи другим потоком нового значения в исходную переменную, первый поток будет видеть свою локальную копию со старым значением. Использование ключевого слова volatile гарантирует, что все потоки всегда будут использовать общее, исходное значение, и они будут видеть изменения этого исходного значения другими потоками сразу же. Аналогично все изменения переменных, произошедшие внутри sychronized-методов и synchronized-блоков, а также блоков с другими блокировками вроде реализаций интерфейса java.util.concurrent.locks.Lock после выхода из блокировки будут гарантировано видны любым другим потокам после взятия блокировки над тем же самым объектом, но если более сложные блокировки не нужны, то можно использовать volatile. Можно даже использовать их совместно — особого вреда, я думаю, не будет.

Переменная volatile  используется в одном из вариантов реализаций паттерна синглетон.


Поделиться:

Зачем нужно volatile в Java: 1 комментарий

  1. Многопоточность — зло великое. И простому комьютеру с этим не справится. Два процесса подерутся за ресурсы и компьютер зависнет.
    Как можно убедить процессор не помещать значение в кэш?
    Ведь это он делает автоматическиЙ
    Лишь существам сверхъестественным и могучим возможно за один момент два дела делать.

Добавить комментарий

Ваш e-mail не будет опубликован.

*