Dalvik VM & Модель памяти Java (параллельное программирование на Android) - PullRequest
47 голосов
/ 07 августа 2011

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

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

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

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

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

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

  1. Где найти подробную информацию о виртуальной машине Dalvik, которая может предоставить ответы на приведенные ниже вопросы?
  2. На какую редакцию Спецификация языка Java виртуальная машина Dalvikсоответствует?
  3. Если ответом на (2) является «третье издание», то насколько полная поддержка Далвиксом Java Memory Model не определена в данной спецификации?И особенно, как завершить поддержку семантики volatile переменных?
  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'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 .

Ответы [ 4 ]

2 голосов
/ 03 августа 2012

Я не полностью прочитал ваш вопрос, но прежде всего не использую volatile, даже кодеры opengles не используют его для разных потоков пользовательского интерфейса и визуализации.

Используйте volatile тогда и только тогда, когда один поток пишет(скажем, статическое свойство какого-то класса) и другие операции чтения, даже если вам нужно синхронизировать, прочитайте это для некоторых хороших способов обработки счетчиков

Как синхронизировать статическую переменную между потоками, выполняющими различные экземплярыкласс в Java?

  1. всегда использовать синхронизацию
  2. не прыгайте на больших проектах для таких сложных тем, как параллельное программирование
  3. пройти примеры Android наигры, в которых обсуждалась концепция запускаемых программ, обработчиков и обмена сообщениями в ч / б потоках (UI THREAD AND RENDERER THREAD).
1 голос
/ 29 июля 2012

Я думаю, что вы ответили на свой вопрос, хотя вы и не сообщили, почему пакет java.util.concurrent не соответствует вашим потребностям, большинство мобильных приложений просто используют асинхронный ввод-вывод и минимальные потоки. Эти устройства не являются суперкомпьютерами, способными к серьезной распределенной обработке, поэтому мне сложно понять, почему java.util.concurrent не отвечает вашим потребностям.

Во-вторых, если у вас есть вопросы о реализации Dalvik и о том, соответствует ли она JLS (это не так), может показаться, что единственной надежной поддержкой механизмов потоков являются те, которые определяет язык - java.util. одновременное, работоспособное и потоковое локальное хранилище.

Ручное переключение чего-либо за пределы встроенной языковой поддержки только вызывает проблемы, и, как предполагает ваш вопрос, вероятно, не будет согласованно поддерживаться в Dalvik.

Как всегда, когда вы думаете, что можете выполнять многопоточность лучше, чем парни, написавшие Java, подумайте еще раз.

0 голосов
/ 30 июля 2012

Вот честный ответ. Если java.util.concurrent не подходит для вашей реализации, тогда ваша проблема не в java.util.concurrent, а в исходных спецификациях проекта. Пересмотрите свой дизайн, возможно, опубликуйте здесь, что в вашем дизайне делает использование простого мьютекса, не для вас, и тогда сообщество может показать вам, как его проектировать лучше.

0 голосов
/ 16 августа 2011

Dalvik не соответствует ни одной редакции JLS, потому что для соответствия требуется передать JCK , что не является опцией для Dalvik.

программисты действительно должны знать, на какие функции JLS они могут полагаться при выполнении своего кода в Dalvik

Я думаю, что единственный способ узнать это -Изучите тестовый набор Dalvik (могу поспорить, что он есть, и я ожидаю, что это открытый код, не так ли?).Для любой функции, которая вам нужна: 1) попытайтесь найти тест, который не прошел бы, если ваша функция реализована неправильно, и проверьте, выглядит ли тест достаточно хорошо.Если такого теста нет или он недостаточно хорош, 1a) добавьте новый или улучшите существующий тест.Затем 2) выясните, был ли тест успешно запущен для вашей целевой реализации.Если тест не был запущен, то 2a) запустите его самостоятельно и выясните, прошел он или нет.

Кстати, выше, примерно как работает JCK .Основное отличие заключается в том, что с Dalvik приходится тратить свое время и силы на то, что вы получаете от Sun / Oracle как должное.Другое отличие, по-видимому, в том, что для Dalvik это не задокументировано, в то время как Snorcle имеет четкие документы по этому iirc

Но в документации нет никаких слов об этом.

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

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