Ответ 1
Вот краткое резюме:
- Для ссылок, чтения/записи ВСЕГДА атомные (даже в 64-битных реализациях!)
- Для
int
,char
,byte
,short
,boolean
,float
, чтение/запись ВСЕГДА атомный - Для
double
иlong
, если ониvolatile
, чтение/запись ALWAYS atomic
Поэтому существует только исключение, когда чтение/запись не может быть атомарным:
- Для
double
иlong
, если они НЕ объявленыvolatile
, они НЕ ГАРАНТИРОВАНЫ, чтобы быть атомарными
. Что касается атомарности чтения/записи общих данных, вам нужно сделать только volatile
any double
или long
. Все остальное уже гарантировано будет атомарным, независимо от того, сколько бит используется в реальной реализации.
В спецификации
Здесь соответствующий раздел воспроизводится здесь для быстрой справки:
JLS 17.7 Неатомная обработка
double
иlong
В некоторых реализациях может быть удобно разделить одно действие записи на 64-разрядное значение
long
илиdouble
на два действия записи по смежным 32-битным значениям. Для эффективности это поведение специфично для реализации; Виртуальные машины Java могут выполнять запись в значенияхlong
иdouble
атомарно или в двух частях.Для модели памяти языка программирования Java одна запись в значение не
volatile long
илиdouble
рассматривается как две отдельные записи: одна для каждой 32-разрядной половины. Это может привести к ситуации, когда поток видит первые 32 бита 64-битного значения из одной записи, а второй 32 бита из другой записи. Записи и чтения значенийvolatile long
иdouble
всегда являются атомарными. Записи и чтения ссылок всегда являются атомарными, независимо от того, реализованы ли они как 32 или 64-битные значения.Разработчики VM рекомендуется избегать расщепления их 64-битных значений, где это возможно. Программистам рекомендуется объявлять общие 64-битные значения как
volatile
или правильно синхронизировать их программы, чтобы избежать возможных осложнений.
См. также
- JLS 17.6 Word Tearing - гарантирует, например, a
byte
может быть обновлен без соседних помех. - JLS 8.3.1.4
volatile
Поля - Учебники по Java/Основные классы/ Concurrency/Атомные переменные
- Обратите внимание, что данный
int i;
,i++
НЕ атомный!
- Обратите внимание, что данный
Связанные вопросы
- Есть ли смысл долгое время использовать volatile?
- Как объявить элементы массива volatile в Java?
- A
volatile long[]
- этоvolatile
ссылка на массивlong
- Элементы
long
не являютсяvolatile
- A