Чтение и запись локальных переменных Long и Double в Java

Известно, что «чтение / запись в» энергонезависимые переменные типа long и double могут быть неатомарными. Это касается статических и нестатических полей и массивов.

А как насчет соответствующих длинных / двойных локальных переменных. Атомные они или нет.


person Vitaly    schedule 21.02.2017    source источник
comment
Локальная переменная не будет использоваться в нескольких потоках.   -  person Snehal Patel    schedule 21.02.2017
comment
Если они местные, почему вас волнует атомарность? Другие потоки не могут получить доступ к локальным переменным.   -  person sparik    schedule 21.02.2017
comment
В общем, возникают проблемы, потому что чтение, запись в long и double не является атомарным. Если вы используете локальные переменные, к которым имеет доступ только один поток, это не должно быть проблемой. Возможно дублирование: stackoverflow.com/questions/517532/   -  person Supahupe    schedule 21.02.2017
comment
Если под локальным вы подразумеваете локальный для метода или инициализатора (что будет стандартным значением), проблем нет, поскольку, как уже было сказано, нет возможности, чтобы два потока могли получить доступ к одной и той же переменной.   -  person Ole V.V.    schedule 21.02.2017
comment
Да, они не являются общими, но это действие может быть действием расхождения потоков, как указано в модели памяти и, следовательно, касается спецификации JMM   -  person Vitaly    schedule 21.02.2017
comment
Я не понимаю, как действие расхождения потоков может иметь отношение к атомарности чтения и записи длинных или двойных строк. Действие расхождения потоков в некоторых случаях может вызвать зависание других потоков, но если так, то это будет иметь место независимо от того, является ли чтение или запись длинного или двойного числа атомарным или нет.   -  person Ole V.V.    schedule 21.02.2017
comment
Следовательно, вы имеете в виду, что эта проблема не отражена в официальной документации, поскольку это не имеет значения и зависит от конкретной реализации JVM.   -  person Vitaly    schedule 21.02.2017


Ответы (1)


Примитивные значения никогда не сохраняются в куче, если они отображаются как локальная переменная. Это означает, что они не могут быть общими, поскольку они хранятся в стеке и недоступны для других потоков. Изнутри этого потока вам гарантируется последовательная согласованность, что означает, что вы всегда будете видеть последнее присвоенное значение.

person Rafael Winterhalter    schedule 21.02.2017