Todos los objetos disponen de un monitor interno, que solo permite el acceso de un hilo a la vez

Que son los monitores

  • Estructura de alto nivel para la gestión de concurrencia
  • El monitor sólo permite el acceso a un hilo a la vez
  • Contiene una lista priorizada de hilos en espera para entrar
  • Gestiona dicho acceso

Porque los necesitamos

La sincronización solo nos garantiza que a un recurso no se puede acceder a la vez desde más de un sitio, pero no nos garantiza que el hilo que tenía que acceder lo haya hecho.

Si nos imaginamos un hilo que va dejando información en una variable, y otro hilo que la va recogiendo, necesitamos controlar que los dos hilos no accedan a la vez, que eso nos lo hace el synchronized, pero también necesitamos estar seguro que el hilo que deja la información, lo haya hecho, antes de poder recogerla

Para ello, deberíamos comprobar si tenemos la información, y si no, esperar, y así, hasta que aparezca

Los monitores nos permiten quedarnos esperando que el otro programa deje la información, y luego, que nos avise para poderla recoger

Como funcionan

Los hilos llevan su propio control de avance y parada, para ello, disponen de los métodos:

  • wait() Detiene la ejecución del hilo hasta recibir una notificación
  • notify() Despierta a uno de los hilos detenidos (A cualquiera de ellos)
  • notifyAll() Despierta a todos los hilos detenidos
    • Todos pasan a estar “en espera” hasta que el planificador les ceda el turno, claro

Para invocar el método wait es necesario tener el control del monitor… por tanto, siempre debe activarse dentro de un método sincronizado

Cada hilo ha de esperar el evento, por lo que la llamada a wait, es conveniente hacerla dentro de un while

En el otro hilo, cuando deseemos liberar a los hilos que están esperando, podemos hacer

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.