Изменчивые ключевые слова и ошибки согласованности памяти

В документации Java оракуланаходится здесьсказано следующее:

Атомарные действия не могут быть чередованы, поэтому они могут использоваться без опасения вмешательства потока. Однако это не устраняет всей необходимости синхронизировать атомарные действия, поскольку ошибки согласованности памяти все еще возможны. Использование энергозависимых переменных снижает риск ошибок согласованности памяти, потому что любая запись в энергозависимую переменную устанавливает отношение «происходит до» с последующим чтением этой же переменной. Это означает, что изменения в изменчивой переменной всегда видны другим потокам. Более того, это также означает, что когда поток читает переменную volatile, он видит не только последнее изменение volatile, но и побочные эффекты кода, который привел к изменению.

Это также говорит:

Чтение и запись являются атомарными для ссылочных переменных и для большинства примитивных переменных (все типы, кроме long и double).Чтение и запись являются атомарными для всех переменных, объявленных как volatile (включая длинные и двойные переменные).

У меня есть два вопроса относительно этих заявлений:

«Использование энергозависимых переменных снижает риск ошибок согласованности памяти» - что они подразумевают под «уменьшает риск», и как все еще возможна ошибка согласованности памяти при использовании энергозависимости?

Верно ли было бы сказать, что единственный эффект размещения volatile на недвойном, недлинном примитиве - это включение отношения «происходит до» с последующим чтением из других потоков? Я спрашиваю об этом, поскольку кажется, что эти переменные уже имеют атомарные чтения.

Ответы на вопрос(6)

Ваш ответ на вопрос