У меня есть типичный условной переменной, реализованный в Явы фундаментальной синхронному/ожидания:High CPU в Object.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) одновременными запросами, загрузка процессора составляет около 80%, а профилировщик сообщает в 80% случаев, когда приложение тратится на метод wait(). Обычно высокий процессор может быть вызван ожирением в коде приложения. Но почему бы ждать() себя всю жизнь? Спасибо
Хост является хостом VMware, работающим под управлением Oracle JVM 1.6.
Это просто эксперимент? Потому что, если это настоящий код, вы должны использовать новые 'Lock' и' Condition', а не 'synchronized' и' wait'/'notify'. –
Почему @ bmorris591? Что случилось со стандартными механизмами? – Gray
@Gray Нет ничего плохого в них, но новые механизмы теперь принимаются в лучшую практику. –