Я работаю над проектами Android, которые включают в себя много параллельного программирования, и я собираюсь реализовать некоторые пользовательские средства связи между потоками (один из java.util.concurent не очень подходит для моегоцели).
Параллельное программирование в общем не легкое, но с Dalvik это кажется еще сложнее.Чтобы получить правильный код, вы должны знать некоторые конкретные вещи и проблемы, возникающие с Dalvik.Я просто не могу найти подробную документацию о Dalvik VM.Большинство ресурсов Android (даже developer.android.com ориентированы на API платформы и не предоставляют никакой глубокой информации о некоторых нетривиальных (или низкоуровневых) вещах).
ДляНапример, какой редакции Java Language Specification соответствует Dalvik VM?В зависимости от ответа обработка volatile
переменных различна и влияет на любой параллельный код, который использует переменные volatile
.
Уже есть несколько связанных вопросов:
и некоторые ответы fadden очень полезны, но я все еще хочу получить более подробное и полное понимание рассматриваемого вопроса.
Итак, ниже сырых вопросов, в которых я заинтересован (я буду обновлять список при необходимости, так как будут получены ответы на предыдущие вопросы):
- Где найти подробную информацию о виртуальной машине Dalvik, которая может предоставить ответы на приведенные ниже вопросы?
- На какую редакцию Спецификация языка Java виртуальная машина Dalvikсоответствует?
- Если ответом на (2) является «третье издание», то насколько полная поддержка Далвиксом Java Memory Model не определена в данной спецификации?И особенно, как завершить поддержку семантики
volatile
переменных? В Двойной проверке блокировки в Android fadden предоставьте следующий комментарий:
Да.С добавлением ключевого слова «volatile» это будет работать на унипроцессоре (все версии Android) и SMP (3.0 «соты» и выше)
Означает ли это, что Samsung Galaxy SII, который имеет двухъядерный процессор, но только Android 2.3 может неправильно выполнять параллельный код?(конечно, Galaxy - только пример, вопрос касается любого многоядерного устройства с платформой до Android 3.0)
В Модель памяти Dalvik такая же, как у Java? fadden дают ответ со следующим предложением:
Никакая версия Dalvik, поставляемая в настоящее время, не является полностью правильной в отношении JSR-133
Означает ли это, что любой существующий правильный параллельный код Java может работать некорректно на любой версии Android, выпущенной до публикации этого комментария?
Обновление № 1: Ответ @ gnat'sкомментарий (слишком длинный, чтобы комментировать)
@ gnat опубликовать комментарий:
@ Алексей Далвик не соответствует ни одному изданию JLS, поскольку для соответствия требуется передача JCK, который не являетсявариант для далвика. Значит ли это, что вы даже не можете применить стандартный компилятор Java, потому что он соответствует стандартной спецификации? это имеет значение?если да, то как?
Ну, мой вопрос был как-то двусмысленным.На самом деле я имел в виду, что JLS - это не только правила для реализаций компилятора Java, но также неявные рекомендации для любых JVM реализаций.Действительно, JLS , например, утверждает, что чтение и запись некоторых типов являются атомарными операциями.Это не очень интересно для автора компилятора, потому что чтение / запись переводится только в один код операции.Но для любой реализации JVM важно, чтобы должен правильно реализовывать эти коды операций.Теперь вы должны увидеть, о чем я говорю.В то время как Dalvik принимает и выполняет программы, скомпилированные с помощью стандартного Java-компилятора, нет никаких гарантий , что они выполняются правильно (как вы можетеожидать) только потому, что никто (кроме, может быть, разработчиков Dalvik) не знает, поддерживаются ли все функции JLS, используемые в программе, Dalvik.
Ясно, что JCK не подходит для Dalvik иэто нормально, но программисты действительно должны знать, на какие функции из JLS они могут положиться при выполнении своего кода в Dalvik.Но в документации нет ни слова об этом.Хотя вы можете ожидать, что простейшие операторы, такие как =, +, -, * и т. Д., Работают так, как вы ожидаете, что насчет нетривиальных функций , подобных семантике volatile
переменных (которая отличается во 2-м и 3-м местах)издания JLS )?И последнее не самая нетривиальная вещь, которую вы можете найти в JLS и особенно в Модель памяти Java .