Почему здесь нужно блокировать нить повара? И вообще не очень понятно когда следует блокировать нить (объект this в блоке синхронизации это же мьютекс нити?)?
synchronized (this) {
needToWait = !needToCookOrders();
if (!needToWait) {
cooking();
}
}