Дело в том, что «висеть» на методе wait()
одного монитора могут сразу несколько потоков. При вызове notify()
только один из них выходит из wait()
и пытается захватить монитор, а затем продолжает работу со следующего после wait()
оператора. Какой из них выйдет — заранее неизвестно. А при вызове notifyAll()
, все висящие на wait()
потоки выходят из wait()
, и все они пытаются захватить монитор. Понятно, что в любой момент времени монитор может быть захвачен только одним потоком, а остальные ждут своей очереди. Порядок очереди определяется планировщиком потоков Java.