0

同時に実行されている多くのスレッドによって呼び出される列挙型のメソッドがあります。

JVM では、列挙型のインスタンスを 1 つだけメモリに割り当てることができるため、CPU が同じ位置にアクセスするのをスレッドが待機するのを避けるために、コンパイラまたは JVM 自体によって最適化が行われていると思います。メソッドがメモリを消費し、スレッドごとにメソッドを何度も実行するため、ボトルネックが発生します。

スレッドの数を 5 から 300 に変更しても (ScheduledExecutorService を使用して実行しています)、システムの全体的なスループットに違いは見られません。

本当に最適化が行われているのでしょうか、それとも私が想像しているものとは異なりますか?

4

3 に答える 3

2

すべてのメソッドがメモリへのアクセス (読み取り) を行っている場合、競合は発生しません。値を変更せず、インスタンスまたは静的変数に値を保持していない場合、メソッドは同期なしで「スレッドセーフ」です。

問題を完全に述べていないか、問題がありません。

于 2012-08-20T01:07:26.683 に答える
1

スループットの向上が見られない理由は、タスクを並列に実行することによって得られる節約が、コードやプログラムが何をしているのかを理解するのが難しいため、これらすべてのスレッドを作成する費用によって取り除かれる可能性があるためです。ただし、スレッド プールなどの手法を使用しても、スレッドの作成と破棄は無料ではないことに注意してください。そのため、多数のスレッドを作成するだけでは、スループットが向上する保証はありません。

于 2012-08-20T01:19:00.017 に答える
0

メモリ アクセスが読み取り専用でない限り、つまり変数の値を更新するスレッドがない場合を除き、スループットは変わりません。並行性の問題がまだあると思われる場合は、JNI を試してください。

于 2012-08-20T02:02:49.060 に答える