Является ли модель памяти Dalvik такой же, как Java? Меня особенно интересует, являются ли чтения и записи ссылочных и не long
/не double
примитивных переменных атомарными, но я также хотел бы знать, существуют ли различия между моделями памяти двух платформ.
Модель памяти Dalvik такая же, как Java?
Ответ 1
Начиная с 4.0 (сэндвич с мороженым) поведение Dalvik должно совпадать с JSR-133 (модель памяти Java).
Начиная с версии 3.0 (Honeycomb), большинство частей было на месте, но некоторые незначительные вещи были упущены, что было бы трудно встретить на практике (например, некоторые случаи краев при завершении).
Начиная с версии 2.3 (Gingerbread), Dalvik, как правило, был прав на однопроцессорных системах, но некоторые ключевые функции, необходимые для правильного поведения на оборудовании SMP (например, правильная обработка полей final
), отсутствовали.
Pre-Gingerbread, никаких барьеров памяти вообще не было, и основные вещи, такие как volatile long
, были сломаны.
Ответ 2
В источнике Dalvik есть который гласит:
С точки зрения фрагмента кода, написанного на языке программирования Java или нацеленного таким же образом на файлы .class, Dalvik VM стремится вести себя таким образом, который полностью согласуется с определением языка. То есть код, работающий в Dalvik, будет вести себя так же, как и в любой другой виртуальной машине.
Это должно означать, что поведение такое же, как в правильной Java. На самом деле это или нет, я понятия не имею.
Ответ 3
В спецификации указано, что все операции над 32-битными номерами (недвойные, недолгочисленные числа) являются атомарными. Нет гарантии, что операции с 64-разрядными номерами также являются атомарными.