Подтвердить что ты не робот

Написание long и double не является атомарным в Java?

Чтение и запись одной переменной является атомарной (языковая гарантия!), если переменная не имеет тип long или double.

Я читал слайды курса, и я нашел это написанным. Класс был около concurrency.

Может кто-нибудь объяснить мне, почему писать длинный или двойной - это не атомная операция? Это действительно застало меня врасплох.

4b9b3361

Ответ 1

Это не атомно, потому что это многоступенчатая операция на уровне машинного кода. То есть длины и удвоения длиннее длины слова процессора.

Ответ 3

Модель памяти языка программирования Java, одна запись в энергонезависимое длинное или двойное значение рассматривается как две отдельные записи: по одной на каждую 32-битную половину. Это может привести к ситуации, когда поток видит первые 32 бита 64-битного значения из одной записи, а второй 32 бита из другой записи.

Ответ 4

Прочитать ответ maaartinus @Какие операции в Java считаются атомными?
Прочитать ответ Jon Skeet @Когда примитивные типы данных не потокобезопасны в Java?

В соответствии с JLS вы можете сделать операцию чтения и записи двойным и длинным, чтобы быть атомарным, объявив его изменчивым. Но это не гарантирует, что ++ будет атомарным. Для этого нужен пакет concurrent.atomic.
Прочитайте этот ответ от Луи Вассермана.

Также этот blog и комментарии.

Ответ 5

Java long и double не являются атомарными в 32-битных машинах, а атомарными в 64-битных машинах с некоторыми из 64-разрядных JVM. почему он зависит от длины бит машины? Поскольку 32-битная машина требует двух длительных записей (до 64 бит). Подробнее читайте этот.

Ответ 6

Многие программисты должны были прочитать это утверждение в "3.1.2. Нетатомные 64-разрядные операции" в java concurrency на практике. Я добавил новую версию JLS https://docs.oracle.com/javase/specs/jls/se9/html/jls-17.html#jls-17.7. Они по-прежнему не утверждают, что 64-битные jVM являются нормой в наши дни. Таким образом, 64-разрядные операции разбиваются на 32-разрядные операции, которые ломают атомарность и опасны для использования в многопоточной среде до тех пор, пока не будут объявлены нестабильными. Длинные и двойные длиной 64 бит в java. Поэтому операции записи и чтения не являются атомарными в java.