9

Java メモリー・モデルは、スレッドがメモリーを介してどのように対話するかについて、想定できることと想定できないことを明確にします。たとえば、あるスレッドが適切な同期を行わずにフィールドに新しい値を書き込んだ場合、その新しい値は他のスレッドによって観測可能であるとは限りません。ただし、実際には、書き込みと読み取りの間の時間、ハードウェア アーキテクチャなどによっては、同期が不十分であるにもかかわらず、他のスレッドが新しい値を読み取る可能性があります。

これにより、発見が困難で再現が困難なバグが発生する可能性があります。したがって、 Java メモリ モデルで保証されているスレッド間のメモリ同期をまったく行わない最悪のケースの JVM で Java アプリケーションを実行すると便利な場合があります。そのような最悪のケースの JVM 実装は存在しますか?

4

5 に答える 5

2

Terracottaを使用してプログラムをクラスター化することができます。不適切な同期については非常に容赦がありません (クラスター内にノードが 1 つしかない場合でも明らかになります)。これは素晴らしい質問です。私はしばしばこの機能をまさに望んでいました。標準の JRE にスイッチがないことに驚いています。-XXJMMExtreme

Terracotta はオープンソースであり、基本的な製品は無料です。

于 2009-02-16T19:52:06.290 に答える
1

これが役立つかもしれません: http://javapathfinder.sourceforge.net/

于 2009-02-16T19:56:18.137 に答える
0

最悪の場合の動作を常に保証する VM を知りません。これは、あなたが求めているもののようです。説明している状況は、Sun VM (および他の多くの VM) で発生する可能性がありますが、キャッシュの問題が原因でのみ発生します。私は、常に意図的にこれを行う VM に慣れていません。

于 2009-02-16T19:52:32.407 に答える
0

並行性のバグを引き起こす可能性のある多くの方法があります。

  • 通常よりも多くのスレッドにアプリケーションをロードします。これが 99% 以上の CPU を得るのに十分であることを確認してください。
  • プロファイラーを有効にするか、JIT を無効にしてプログラムを実行します。これにより、アプリケーションのタイミング動作が変更されます。
  • Java 5 と Java 6 の両方をテストします (多くの場合、これがいくつかのバグを見つける最も簡単で最良の方法です)。

最悪の場合の JVM については、携帯電話を試してください。(あなたのアプリケーションはおそらくまったく動作しません) ;)

于 2009-02-16T20:35:41.927 に答える
0

同期エラーは、異なるスレッド間の微妙なタイミングに依存するため、通常は再現が困難です。そのため、実際に「プログラムを実行するだけ」を試みる実装は、常に「可能な限り最悪」になることはありません。これらの命令を 1 回実行しただけでは、2 つのスレッドが命令をインターリーブできる複数の異なる方法を再現することはできません。このようなすべての組み合わせを 1 回の実行でテストすることは、さらに可能性が低くなります。他の投稿者の 1 人が Java Pathfinder を提案しましたが、これは良いアイデアのように思えますが、これは同じコードを何度も実行するアプリであるため、単なる別の JVM 実装として扱うことはできないことに注意してください。

もう 1 つの実用的なヒントは、できるだけ多くの異なる JVM でアプリを実行してみることです。さまざまなベンダー、同じベンダーのさまざまなバージョン、さまざまな CPU アーキテクチャなどを試してください。数年前、私は Xeon CPU 上の Sun の JVM で開発、テスト、実行された高度にマルチスレッド化されたアプリケーションを使用した経験があり、非常にうまく機能しました。ある時点で、POWER アーキテクチャー上の IBM の J9 Java 仮想マシンで実行しようとしましたが、最初の試みでは、テストの約 2/3 が同期エラーのために失敗しました。したがって、さまざまな環境でのテストは、隠れた同期の問題を明らかにするのに非常に役立ちます。

于 2013-02-27T22:38:34.160 に答える