0

Javaの基本的な同期/待機に実装された典型的な条件変数があります:

ConcurrentHashMap incompleted = ...;

// the notifier
incompleted.remove(key);
synchronized (this) {
  if (incompleted.isEmpty()) {
     notifyAll();
  }
}

// the waiter
synchronized (this) { // one this object for each request
   while (!incompleted.isEmpty()) {
     wait(10000L); // this is exact time out pass in
   }
   // done and exit
}

これらのコードは非常に典型的で機能します。ただし、多くの (たとえば 100 の) 同時要求でテストすると、CPU 負荷は約 80% であり、プロファイラーはアプリが wait() メソッドで費やした時間の 80% を報告します。通常、CPU が高いのは、アプリ コードでビジー状態で待機していることが原因である可能性があります。しかし、wait() 自体が常に時間を費やすのはなぜでしょうか? ありがとう

ホストは、Oracle JVM 1.6 を実行する VMware ホストです。

4

2 に答える 2

3

なぜwait()自体がいつも費やされるのでしょうか?

プロファイラーがCPU サイクルではなく実時間で表示されている可能性があります。あなたのスレッドはほとんどの時間を に費やしてwait()いますが、CPU リソースを消費していません。

プロファイラーnotify()CPU サイクルを示している場合は、代わりに に切り替えることを検討してくださいnotifyAll()。何かをデキューできるスレッドが 1 つだけの場合、100 のスレッドすべてをウェイクアップする理由はありません。

于 2013-04-13T17:36:56.757 に答える
0

OK、私の間違いです。このプロファイラーでは、最初のビューは実時間です。CPUの燃焼時間と間違えました。しかし、なぜ Object.wait() でほぼ 100% の壁時間がかかるのに、依然として CPU 負荷が高いのでしょうか。多分それは別の質問です。

于 2013-04-14T06:43:51.240 に答える