Object.wait()中的高CPU

时间:2013-04-13 17:33:38

标签: java multithreading synchronization cpu-usage

我有一个典型的条件变量,用Java的基本synchronized / wait实现:

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()本身会一直花费?感谢

主机是VMware主机,运行Oracle JVM 1.6。

2 个答案:

答案 0 :(得分:3)

  

为什么wait()本身会花费所有时间?

您的探查器可能显示您的挂钟时间和 CPU周期。你的线程大部分时间花在wait()上,是的,但是没有消耗CPU资源。

如果探查器 显示CPU周期,那么您应该考虑切换到notify()而不是notifyAll()。如果只有一个线程能够对某些内容进行排队,则没有理由唤醒所有100个线程。

答案 1 :(得分:0)

好的,我的错误。在此分析器中,第一个视图是挂钟时间。我把它误认为是cpu刻录时间。但是为什么我会在Object.wait()中获得几乎100%的挂起时间,但仍然是高CPU负载。也许这是另一个问题。