java - progressbar - semaforos y monitores
Java: ¿Se liberan todos los monitores cuando el hilo espera un objeto? (3)
De la documentación de la API de Java de la clase Object :
El hilo actual debe poseer el monitor de este objeto. El subproceso libera la propiedad de este monitor y espera hasta que otro subproceso notifique a los subprocesos que esperan en el monitor de este objeto para que se activen a través de una llamada al método de notificación o el método notifyAll. El hilo luego espera hasta que pueda volver a obtener la propiedad del monitor y reanudar la ejecución.
Por lo tanto, llamar a b.wait()
libera el bloqueo en b
solamente.
Antes de que un hilo pueda wait
en un objeto, tiene que adquirir un monitor en ese objeto. El monitor se libera y el hilo intenta volver a adquirirlo una vez que se despierta.
¿Pero qué sucede con otros monitores que mantiene el hilo cuando llama a wait
?
Considera este ejemplo:
Object a = // ... Object b = // ... synchronized(a) { synchronized(b) { b.wait(); // continue } }
Cuando el hilo llama a b.wait()
, ¿liberará los bloqueos en a
y b
, o solo b
?
Sólo b
.
La fuente autoritaria para este tipo de preguntas es la Especificación del lenguaje Java. La sección relevante en este caso es 17.8 Conjuntos de espera y notificación :
Deje que el hilo t sea el hilo que ejecuta el método de espera en el objeto m , y sea n el número de acciones de bloqueo por t en m que no se han combinado con las acciones de desbloqueo. Una de las siguientes acciones ocurre.
- [...]
De lo contrario, se produce la siguiente secuencia:
- El hilo t se agrega al conjunto de espera del objeto m , y realiza n acciones de desbloqueo en m .
- [...]
Sólo AFAIK b. Es una fuente clásica de puntos muertos.