Первый оператор не относится к созданию ссылочных переменных и примитивных переменных (за исключением long
и double
) volatile
.
Он говорит читает и записывает всех ссылочных переменных и всех примитивов, кроме long
и double
, равных atomic (по умолчанию).Чтобы читает и пишет из long
и double
атомный они должны быть volatile
.
Атомность не имеетчто-либо связанное с visibility .
Следующий абзац того же документа
Атомарные действия не могут быть чередованы, поэтому они могут использоваться без боязни вмешательства потока,Однако это не устраняет всей необходимости синхронизировать атомарные действия, поскольку ошибки согласованности памяти все еще возможны.Использование энергозависимых переменных снижает риск ошибок согласованности памяти, потому что любая запись в энергозависимую переменную устанавливает отношение «происходит до» с последующим чтением этой же переменной.
Итак, операторы типа a = 1
, где a
- это int
(например) atomic , но вам все еще нужно иметь volatile , если вы хотите, чтобы назначение было видимым для любого последующего чтенияпотоки.
Чтение / запись в переменную long / double является сложным действием, и volatile гарантирует, что оно атомарно.