Je travaille sur des projets Android qui impliquent beaucoup de programmation concurrente et je vais implémenter des fonctions de communication inter-threads personnalisées (celles de la section java.util.concurent ne sont pas bien adaptés à mes besoins).
La programmation concurrente n'est pas facile en général, mais avec Dalvik, cela semble être encore plus difficile. Pour obtenir un code correct, vous devez connaître certaines choses spécifiques et c'est là que le problème se pose avec Dalvik. Je n'arrive pas à trouver une documentation détaillée sur la VM Dalvik. La plupart des ressources Android (même les développeur.Android.com se concentre sur l'API de la plateforme et ne fournit pas d'informations approfondies sur certaines choses non triviales (ou de bas niveau)).
Par exemple, à quelle édition de Spécification du langage Java la VM Dalvik est conforme ? En fonction de la réponse, le traitement de volatile
sont différentes et affectent le code concurrent qui utilise la variable volatile
variables.
Il y a déjà quelques questions connexes :
- Le modèle de mémoire de Dalvik est-il le même que celui de Java ?
- Double vérification du verrouillage dans Android
et quelques réponses par fadden sont très utiles, mais je souhaite toujours obtenir une compréhension plus détaillée et complète de la matière en question.
Voici donc une liste de questions brutes qui m'intéressent (je mettrai la liste à jour si nécessaire, au fur et à mesure que les réponses aux questions précédentes arriveront) :
-
Où trouver les détails sur la VM Dalvik qui peuvent fournir les réponses aux questions ci-dessous ?
-
A quelle édition de Spécification du langage Java la VM Dalvik est conforme à ?
-
Si la réponse à la question (2) est "troisième édition", alors dans quelle mesure le soutien des Dalviks à l'initiative de l'Union européenne est-il complet ? Modèle de mémoire Java défié dans ce cahier des charges ? Et surtout, quel est le degré de complétude de la prise en charge de la sémantique des
volatile
variables ? -
Dans le Double vérification du verrouillage dans Android el fadden fournir le commentaire suivant :
Yup. Avec l'ajout du mot-clé "volatile", cela fonctionnera sur uniprocesseur (toutes les versions d'Android) et SMP (3.0 "honeycomb" et ultérieures)
Est-ce que cela signifie que Samsung Galaxy SII qui a un processeur à double cœur mais seulement Android 2.3 peut exécuter le code concurrent de manière incorrecte (bien sûr, Galaxy n'est qu'un exemple, la question concerne tout appareil multicœur avec une plateforme pré-Android 3.0).
-
Dans le Le modèle de mémoire de Dalvik est-il le même que celui de Java ? el fadden donnez la réponse à l'aide de la phrase suivante :
Aucune version de Dalvik actuellement disponible n'est entièrement correcte en ce qui concerne la JSR-133.
Cela signifie-t-il que tout code Java concurrent correct existant peut fonctionner incorrectement sur toute version d'Android publiée à la date de publication de ce commentaire ?
Update#1 : Réponse au commentaire de @gnat (trop long pour être un commentaire aussi)
@gnat poster un commentaire :
@Alexey Dalvik n'est conforme à aucune édition de JLS, car la conformité nécessite de passer le JCK, ce qui n'est pas une option pour Dalvik. Cela signifie-t-il que vous ne pouvez même pas utiliser le compilateur Java standard parce qu'il est conforme aux spécifications standard ? Cela a-t-il une importance ? Si oui, comment ?
Eh bien, ma question était en quelque sorte ambiguë. Ce que je voulais dire en fait c'est que JLS n'est pas seulement les règles pour les implémentations du compilateur Java mais aussi une implicite des directives pour tout JVM mises en œuvre. En effet, JLS par exemple, stipule que la lecture et l'écriture de certains types sont atomique opérations. Ce n'est pas très intéressant pour l'auteur du compilateur parce que la lecture/écriture est traduite en un seul opcode. Mais il est essentiel pour tout JVM mise en œuvre qui devrait mettre en œuvre ces opcodes correctement. Maintenant vous devriez voir de quoi je parle. Alors que Dalvik accepte et exécute les programmes compilés avec le compilateur standard de Java, il y a aucune garantie qu'ils sont exécutés correctement (comme vous pouvez vous y attendre) juste parce que personne (sauf peut-être les développeurs de Dalvik) ne sait si toutes les fonctionnalités de JLS utilisées dans le programme sont supportées par Dalvik.
Il est clair que JCK n'est pas une option pour Dalvik et c'est Ok, mais les programmeurs devraient vraiment savoir sur quel caractéristiques de JLS ils peuvent compter quand ils exécutent leur code sur Dalvik. Mais il n'y a aucun mot à ce sujet dans la documentation. Bien que l'on puisse s'attendre à ce que les opérateurs les plus simples comme =, +, -, *, etc. fonctionnent comme prévu, qu'en est-il des opérateurs non triviaux ? caractéristiques comme la sémantique de volatile
variables (ce qui est différent dans les 2e et 3e éditions de JLS ) ? Et ce n'est pas la chose la plus banale que l'on puisse trouver dans les documents suivants JLS et particulier dans Modèle de mémoire Java .