Написание длинных и двойных не атомарно в Java? - PullRequest
26 голосов
/ 05 февраля 2009

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

Я читал слайды курса и обнаружил, что написано. Класс был о параллелизме.

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

Ответы [ 6 ]

31 голосов
/ 05 февраля 2009

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

25 голосов
/ 28 июля 2009

Просто чтобы прояснить ситуацию для Java, двойные и длинные не читаются или записываются атомарно, если они не объявлены volatile

JLS - Неатомная обработка двойной и длинной

2 голосов
/ 28 ноября 2016

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

2 голосов
/ 17 мая 2015

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

1 голос
/ 12 октября 2017

Многие программисты должны прочитать это утверждение в «3.1.2. Неатомарные 64-битные операции» на практике в java-параллелизме. Я сослался на последнюю версию JLS 17.7. Неатомарная обработка двойная и длинная . Они до сих пор нигде не утверждают, что 64-битная jVM в наши дни является нормой. Таким образом, 64-битные операции разбиты на 32-битные операции, которые нарушают атомарность и опасны для использования в многопоточной среде, пока не объявлены энергозависимыми. Длинный и двойной 64-битные в Java. Таким образом, операции записи и чтения не являются атомарными в Java.

1 голос
/ 28 марта 2016

Прочитать ответ от maaartinus @ Какие операции в Java считаются атомарными?
Прочитайте ответ Джона Скита @ Когда примитивные типы данных не являются поточно-ориентированными в Java?

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

Также этот блог и комментарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...