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

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

4

2 回答 2

3

为什么 wait() 本身会一直花时间?

可能是您的分析器显示的是您的挂钟时间而不是CPU 周期。您的线程大部分时间都花在了wait(),是的,但这样做并没有消耗 CPU 资源。

如果分析器显示 CPU 周期,那么您应该考虑切换到notify()而不是notifyAll(). 如果只有一个线程能够让某件事情出队,那么就没有理由唤醒所有 100 个线程。

于 2013-04-13T17:36:56.757 回答
0

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

于 2013-04-14T06:43:51.240 回答