Der wichtige Unterschied zwischen dem blockierten und dem Wartezustand ist die Auswirkung auf den Scheduler. Ein Thread in einem blockierten Zustand kämpft um eine Sperre. Dieser Thread zählt immer noch als etwas, das der Scheduler warten muss, und wird möglicherweise in die Entscheidungen des Schedulers einbezogen, wie viel Zeit für laufende Threads zur Verfügung steht (damit die Threads, die die Sperre blockieren, eine Chance erhalten).
Sobald sich ein Thread im Wartezustand befindet, wird die Belastung des Systems minimiert, und der Scheduler muss sich keine Sorgen mehr machen. Es wird ruhend, bis es eine Benachrichtigung erhält. Abgesehen von der Tatsache, dass ein Betriebssystem-Thread besetzt bleibt, ist es völlig aus dem Spiel.
Aus diesem Grund ist die Verwendung von notifyAll weniger als ideal. Es führt dazu, dass eine Reihe von Threads, die zuvor glücklich ruhten und das System nicht belasteten, aufgeweckt wurden. Die meisten von ihnen blockieren, bis sie die Sperre erlangen und den Zustand finden, in dem sie sich befinden Warten ist nicht wahr, und kehren Sie zum Warten zurück. Es wäre vorzuziehen, nur diejenigen Threads zu benachrichtigen, die eine Chance auf Fortschritte haben.
(Wenn Sie ReentrantLock anstelle von intrinsischen Sperren verwenden, können Sie mehrere Bedingungen für eine Sperre festlegen, sodass Sie sicherstellen können, dass der benachrichtigte Thread auf eine bestimmte Bedingung wartet, und den Fehler bei der Benachrichtigung über verlorene Benachrichtigungen vermeiden, wenn ein Thread benachrichtigt wird etwas, auf das es nicht einwirken kann.)