La diferencia importante entre los estados bloqueado y de espera es el impacto en el planificador. Un hilo en un estado bloqueado está compitiendo por un bloqueo; ese hilo todavía cuenta como algo que el programador necesita atender, posiblemente siendo un factor en las decisiones del programador sobre cuánto tiempo dar a los hilos en ejecución (para que pueda dar una oportunidad a los hilos que bloquean el bloqueo).
Una vez que un hilo está en estado de espera, el estrés que ejerce en el sistema se minimiza y el programador no tiene que preocuparse por ello. Permanece inactivo hasta que recibe una notificación. Excepto por el hecho de que mantiene un hilo del sistema operativo ocupado, está completamente fuera de juego.
Esta es la razón por la que el uso de notifyAll es menos que ideal, hace que un grupo de subprocesos que antes estaban felizmente inactivos y sin carga en el sistema se despierten, donde la mayoría de ellos se bloquearán hasta que puedan adquirir el bloqueo, encontrar la condición en la que se encuentran. esperar no es cierto, y vuelva a esperar. Sería preferible notificar solo a aquellos hilos que tienen posibilidades de progresar.
(El uso de ReentrantLock en lugar de bloqueos intrínsecos le permite tener múltiples condiciones para un bloqueo, de modo que pueda asegurarse de que el hilo notificado sea uno que esté esperando en una condición particular, evitando el error de notificación perdida en el caso de que se notifique un hilo para algo sobre lo que no puede actuar).