sobre semaforos progressbar programacion programa productores productor producto procesos personalizar monitores hilos ejemplos consumidores consumidor concurrente java multithreading wait synchronized

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:

    1. El hilo t se agrega al conjunto de espera del objeto m , y realiza n acciones de desbloqueo en m .
    2. [...]

Sólo AFAIK b. Es una fuente clásica de puntos muertos.