47

私は多くの並行プログラミングを含む Android プロジェクトに取り組んでおり、いくつかのカスタムのスレッド間通信を実装する予定です ( java.util.concurentのものは私の目的にはあまり適していません)。

並行プログラミングは一般的に簡単ではありませんが、Dalvik ではさらに難しいようです。正しいコードを取得するには、いくつかの特定のことと、Dalvik で問題が発生する場所を知っておく必要があります。Dalvik VM に関する詳細なドキュメントが見つかりません。ほとんどの Android リソース ( developer.android.comでさえ、プラットフォーム API に焦点を当てており、いくつかの重要な (または低レベルの) ものに関する詳細な情報を提供していません)。

たとえば、Dalvik VM はJava 言語仕様のどのエディションに準拠していますか? 答えに応じて、volatile変数の扱いは異なり、変数を使用する並行コードに影響しvolatileます。

関連する質問がすでにいくつかあります。

faddenによるいくつかの回答は非常に役立ちますが、問題の内容をより詳細かつ完全に理解したいと思っています。

したがって、私が興味を持っている未加工の質問の下に (以前の質問に対する回答が届くので、必要に応じてリストを更新します)。

  1. 以下の質問に対する回答を提供する可能性のある Dalvik VM に関する詳細はどこにありますか?
  2. Dalvik VM が準拠しているJava 言語仕様のエディションはどれですか?
  3. (2) に対する答えが「第 3 版」である場合、Dalviks のJava メモリ モデルのサポートは、この仕様でどの程度完全に無視されていますか? 特に、volatile変数のセマンティックのサポートはどの程度完了していますか?
  4. Androidのダブル チェック ロックではfaddenが次のコメントを提供しています。

    うん。「volatile」キーワードの追加により、これはユニプロセッサ (Android のすべてのバージョン) および SMP (3.0 "honeycomb" 以降) で動作します。

    デュアルコア CPU を搭載しているが Android 2.3 しか搭載していない Samsung Galaxy SII では、同時実行コードが正しく実行されない可能性があるということですか? (もちろん、Galaxy は単なる例です。問題は、Android 3.0 より前のプラットフォームを搭載したマルチコア デバイスに関するものです)。

  5. 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

4

4 に答える 4

2

私はあなたの質問を完全には読んでいませんが、まず第一に、揮発性を使用しないでください。opengles コーダーでさえ、異なる ui とレンダラー スレッドには使用しません。

1 つのスレッドが書き込み (いくつかのクラスの静的プロパティなど) を書き込み、他のスレッドが読み取りを行っている場合に限り、volatile を使用します。

javaでクラスの異なるインスタンスを実行しているスレッド間で静的変数を同期する方法は?

  1. 常に同期を使用する
  2. 並行プログラミングのような難しいトピックのために大規模なプロジェクトに飛びつかないでください
  3. ランナブル、ハンドラー、スレッド間のメッセージ交換 (UI スレッドとレンダラー スレッド) の概念について説明したゲームの android サンプルを調べます。
于 2012-08-03T03:48:03.967 に答える
1

java.util.concurrent パッケージがニーズに合わない理由について詳しく説明していませんが、ほとんどのモバイルアプリは非同期 IO と最小限のスレッドを使用するだけです。これらのデバイスは、深刻な分散処理が可能なスーパー コンピューターではないため、java.util.concurrent がニーズを満たさない理由を理解するのが少し難しいです。

第二に、Dalvik の実装と、それが JLS に準拠しているかどうか (準拠していない) について質問がある場合、スレッド化メカニズムの唯一の信頼できるサポートは、言語が定義するもの (java.util.concurrent、runnable) であると思われます。スレッドローカルストレージ。

組み込みの言語サポート以外で何かを手で転がすことは、トラブルを求めているだけであり、あなたの質問が示唆するように、Dalvik では一貫した方法でサポートされない可能性があります。

いつものように、Java を書いた人たちよりもスレッド化がうまくできると思うときは、もう一度考え直してください。

于 2012-07-29T10:30:30.430 に答える
0

これが正直な答えです。java.util.concurrent が実装に適していない場合、問題は java.util.concurrent ではなく、元の設計仕様にあります。設計を再検討し、単純なミューテックスを使用して設計で何ができていないかをここに投稿してください。そうすれば、コミュニティはそれをより適切に設計する方法を示すことができます。

于 2012-07-30T12:08:51.207 に答える
0

<コメントからコピー> Dalvik は、どの JLS エディションにも準拠していません。準拠には、Dalvik のオプションではないJCKを渡す必要があるためです。</コメントからコピー>

プログラマーは、Dalvik でコードを実行するときに、JLS のどの機能に依存する可能性があるかを本当に知っておく必要があります。

彼らが知る唯一の方法は、Dalvik テスト スイートを研究することだと思います (きっと 1 つあると思いますが、それはオープン ソースだと思いますよね?)。必要な機能については、1)機能が正しく実装されていない場合に失敗するテストを見つけて、テストが十分に機能するかどうかを確認してください。そのようなテストがない場合、または十分でない場合は、1a) 新しいテストを追加するか、既存のテストを改善します。次に、2) ターゲット実装に対してテストが正常に実行されたかどうかを調べます。テストが実行されていない場合は、2a) 自分でテストを実行し、成功するか失敗するかを調べます。

ところで、上記はおおまかにJCKの仕組みに関するものです。主な違いは、Sun/Oracle から当然のこととして得られるもののために、Dalvik に自分の時間と労力を投資しなければならないことです。もう 1 つの違いは、Snorcle がその iirc に関する明確なドキュメントを持っているのに対し、Dalvik についてはこれが文書化れていないことです。

しかし、ドキュメントにはこれについての言葉はありません。

それについての言葉がなければ、Dalvik ドキュメントの品質は最適ではないと思います。そっと話す

于 2011-08-16T11:13:48.213 に答える