Когда не использовать летучий?

Есть ли сценарий, когда мы не будем использовать volatile для члена класса объекта, совместно используемого потоками? Насколько я понимаю, ключевое слово volatile гарантирует, что значение объекта не кэшируется потоком, а всегда читается из памяти, но не помечает его как volatile, не означает, что оно всегда будет кэшироваться потоком. Поэтому мой вопрос: можем ли мы что-либо гарантировать, не помечая такой класс как volatile, или код будет открыт для случайного поведения?

РЕДАКТИРОВАТЬ: я понимаю, что использование volatile для всего не гарантирует правильности моей логики. Мой вопрос носит скорее теоретический характер и является моей попыткой понять модель памяти Java.

3 ответа

Решение

Прежде всего, вы не должны объяснять параллелизм в терминах кэшей. Начиная с версии 2 модель памяти Java является более формальной и имеет более слабые требования. Таким образом, все это происходит до заказа.

если вам нужен параллельный доступ к некоторой переменной, вы должны упорядочить операции записи и чтения по событию before-before. Это самая важная вещь. Volatile - лишь одна из реализаций этого порядка.

Таким образом, вместо volatile вы можете использовать любую операцию с семантикой случается до. Из JLS:

  • Разблокировка на мониторе происходит перед каждой последующей блокировкой на этом мониторе.

  • Вызов start() в потоке происходит до любых действий в запущенном потоке.

  • Все действия в потоке выполняются - перед любым другим потоком успешно
    возвращается из join() в этом потоке.

  • Инициализация по умолчанию любого объекта происходит раньше любого другого
    действия (кроме записи по умолчанию) программы.

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

Если вы не объявляете переменную как volatile и не делаете никакой блокировки мьютекса до того, как к ней обращаетесь, тогда да, вы всегда подвергаете себя непредсказуемому поведению и условиям гонки / взаимоблокировке.

Другие вопросы по тегам