私は多くの並行プログラミングを含む Android プロジェクトに取り組んでおり、いくつかのカスタムのスレッド間通信を実装する予定です ( java.util.concurentのものは私の目的にはあまり適していません)。
並行プログラミングは一般的に簡単ではありませんが、Dalvik ではさらに難しいようです。正しいコードを取得するには、いくつかの特定のことと、Dalvik で問題が発生する場所を知っておく必要があります。Dalvik VM に関する詳細なドキュメントが見つかりません。ほとんどの Android リソース ( developer.android.comでさえ、プラットフォーム API に焦点を当てており、いくつかの重要な (または低レベルの) ものに関する詳細な情報を提供していません)。
たとえば、Dalvik VM はJava 言語仕様のどのエディションに準拠していますか? 答えに応じて、volatile
変数の扱いは異なり、変数を使用する並行コードに影響しvolatile
ます。
関連する質問がすでにいくつかあります。
faddenによるいくつかの回答は非常に役立ちますが、問題の内容をより詳細かつ完全に理解したいと思っています。
したがって、私が興味を持っている未加工の質問の下に (以前の質問に対する回答が届くので、必要に応じてリストを更新します)。
- 以下の質問に対する回答を提供する可能性のある Dalvik VM に関する詳細はどこにありますか?
- Dalvik VM が準拠しているJava 言語仕様のエディションはどれですか?
- (2) に対する答えが「第 3 版」である場合、Dalviks のJava メモリ モデルのサポートは、この仕様でどの程度完全に無視されていますか? 特に、
volatile
変数のセマンティックのサポートはどの程度完了していますか? Androidのダブル チェック ロックでは、faddenが次のコメントを提供しています。
うん。「volatile」キーワードの追加により、これはユニプロセッサ (Android のすべてのバージョン) および SMP (3.0 "honeycomb" 以降) で動作します。
デュアルコア CPU を搭載しているが Android 2.3 しか搭載していない Samsung Galaxy SII では、同時実行コードが正しく実行されない可能性があるということですか? (もちろん、Galaxy は単なる例です。問題は、Android 3.0 より前のプラットフォームを搭載したマルチコア デバイスに関するものです)。
Dalvikのメモリ モデルは Java のメモリ モデルと同じですか? faddenは、次の文で答えを提供します。
JSR-133に関して完全に正しいDalvikの現在出荷されているバージョンはありません
このコメントの投稿日までにリリースされた Android バージョンで、既存の正しい並行 Java コードが正しく動作しない可能性があるということですか?
更新#1: @gnat のコメントへの回答 (コメントするには長すぎます)
@gnat コメントを投稿:
@Alexey Dalvik は、どの JLS エディションにも準拠していません。準拠には、Dalvik のオプションではない JCK を渡す必要があるためです。標準仕様に準拠しているからといって、標準Javaコンパイラすら適用できないということですか?それは問題ですか?はいの場合、どのように?
さて、私の質問はどういうわけかあいまいでした。私が実際に言いたかったのは、JLSは Java コンパイラー実装のルールであるだけでなく、あらゆるJVM実装の暗黙のガイドラインでもあるということです。実際、たとえばJLSは、一部の型の読み取りと書き込みはアトミック操作であると述べています。読み取り/書き込みは単一のオペコードに変換されるため、コンパイラの作成者にとってはあまり興味深いものではありません。ただし、これらのオペコードを適切に実装する必要があるJVM実装には不可欠です。これで、私が話していることがわかるはずです。Dalvik は標準の Java コンパイラでコンパイルされたプログラムを受け入れて実行しますが、保証はありません。プログラムで使用されているすべての JLS の機能が Dalvik によってサポートされているかどうかを誰も (Dalvik の開発者を除いて) 知らないという理由だけで、(ご想像のとおり)それらが正しく実行されること。
JCKが Dalvik のオプションではないことは明らかですが、プログラマーは、Dalvik でコードを実行するときに依存する可能性のあるJLSの機能を知っておく必要があります。しかし、ドキュメントにはこれについての言葉はありません。=、+、-、* などの最も単純な演算子は、変数のセマンティック( JLSの第 2 版と第 3 版では異なる) のような自明ではない機能については期待どおりに機能することを期待するかもしれません。そして後者は、 JLS、特にJava Memory Modelで見られる最も重要なことではありません。volatile