我有一个典型的条件变量,用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。
答案 0 :(得分:3)
为什么wait()本身会花费所有时间?
您的探查器可能显示您的挂钟时间和不 CPU周期。你的线程大部分时间花在wait()
上,是的,但是没有消耗CPU资源。
如果探查器 显示CPU周期,那么您应该考虑切换到notify()
而不是notifyAll()
。如果只有一个线程能够对某些内容进行排队,则没有理由唤醒所有100个线程。
答案 1 :(得分:0)
好的,我的错误。在此分析器中,第一个视图是挂钟时间。我把它误认为是cpu刻录时间。但是为什么我会在Object.wait()中获得几乎100%的挂起时间,但仍然是高CPU负载。也许这是另一个问题。