Dalvik VM и модель памяти Java (параллельное программирование на Android)

Я работаю над проектами Android, которые включают в себя много параллельного программирования, и я собираюсь реализовать некоторые настраиваемые элементы межпотокового взаимодействия (из java.util.concurent не очень подходят для моих целей)

Параллельное программирование в целом непросто, но с Dalvik это кажется еще сложнее. Чтобы получить правильный код, вы должны знать некоторые конкретные вещи и то, где возникают проблемы с Dalvik. Я просто не могу найти подробную документацию по Dalvik VM. Большинство ресурсов Android (даже developer.android.com сосредоточено на API платформы и не предоставляет какой-либо подробной информации о некоторых нетривиальных (или низкоуровневых) вещах).

Например, для какому изданию Спецификации языка Java соответствует Dalvik VM? В зависимости от ответа обработка volatile переменных различается и влияет на любой параллельный код, который использует переменные volatile .

Уже есть некоторые связанные вопросы:

и некоторые ответы fadden очень полезны, но я все же хочу получить более подробное и полное понимание рассматриваемого вопроса.

Итак ниже необработанные вопросы, которые меня интересуют (я буду обновлять список при необходимости, поскольку будут получены ответы на предыдущие вопросы):

  1. Где найти подробности о Dalvik VM, которые могут дать ответы на вопросы ниже?
  2. Какому изданию Спецификации языка Java соответствует виртуальная машина Dalvik?
  3. Если ответ на (2) - «третье издание», то насколько полная поддержка Dalviks модели памяти Java игнорируется в этой спецификации? И особенно насколько полная поддержка семантики изменчивых переменных?
  4. В Блокировка с двойной проверкой в ​​Android fadden содержит следующий комментарий:

    Ага. С добавлением ключевого слова "volatile" это будет работать на однопроцессорных (все версии Android) и SMP (3.0 "соты" и новее)

    Означает ли это, что Samsung Galaxy SII , который имеет двухъядерный процессор, но только Android 2.3 может некорректно выполнять параллельный код? (конечно, Galaxy является лишь примером, вопрос касается любого многоядерного устройства с платформой до Android 3.0)

  5. В Модель памяти Dalvik такая же, как у Java? fadden , предоставьте ответ следующим предложением:

    В настоящее время не поставляемая версия Dalvik является полностью правильной по отношению к JSR-133

    Означает ли это, что любой существующий правильный параллельный код Java может работать некорректно на любой выпущенной версии Android до даты публикации этого комментария?

Обновление №1: ответ на комментарий @ gnat (слишком длинный, чтобы быть комментарием)

@gnat опубликовать комментарий:

@Alexey Dalvik не соответствует никаким JLS edition, поскольку для соответствия требуется передача JCK, что не подходит для Dalvik. Означает ли это, что вы даже не можете применить стандартный компилятор Java, потому что он соответствует стандартной спецификации? имеет ли это значение? если да, то как?

Ну, вопрос у меня как-то неоднозначный. На самом деле я имел в виду, что JLS - это не только правила для реализаций компилятора Java, но также неявные рекомендации для любых JVM реализаций. Действительно, JLS , например, утверждает, что чтение и запись некоторых типов являются атомарными операциями. Это не очень интересно для составителя компилятора, потому что чтение / запись переведено только в отдельные коды операций. Но это важно для любой реализации JVM , которая должна правильно реализовать эти коды операций. Теперь вы должны понять, о чем я говорю. Хотя Dalvik принимает и выполняет программы, скомпилированные с помощью стандартного компилятора Java, нет никаких гарантий того, что они будут правильно выполнены (как и следовало ожидать) только потому, что никто (кроме, возможно, разработчиков Dalvik) знает, все ли функции JLS, используемые в программе, поддерживаются Dalvik.

Ясно, что JCK не подходит для Dalvik, и это нормально, но программисты действительно должны знать, какие функции из JLS они могут полагаться при выполнении своего кода на Dalvik. Но в документации об этом нет ни слова. Хотя вы можете ожидать, что простейшие операторы, такие как =, +, -, * и т. Д. работает так, как вы ожидаете, а как насчет нетривиальных функций , таких как семантика изменчивых переменных (которая отличается во 2-й и 3-й редакциях JLS )? И последнее - не самые нетривиальные вещи, которые вы можете найти в JLS и, в частности, в модели памяти Java .

47
задан Community 23 May 2017 в 12:33
поделиться