Categorías
Concurrency Diagram

Monitores: la idea básica de la sincronización de Java

Si tomó un curso de sistema operativo en la universidad, es posible que recuerde que el monitor es un concepto importante de sincronización en los sistemas operativos. También se utiliza en la sincronización de Java. Esta publicación utiliza una analogía para explicar la idea básica de «monitor».

1. ¿Qué es un monitor?

Un monitor puede considerarse como un edificio que contiene una habitación especial. La sala especial puede ser ocupada por un solo cliente (hilo) a la vez. La sala suele contener algunos datos y códigos.

Si un cliente desea ocupar la habitación especial, primero debe ingresar al Pasillo (Conjunto de entrada) para esperar. El programador elegirá uno en función de algunos criterios (por ejemplo, FIFO). Si es suspendido por alguna razón, será enviado a la sala de espera y se programará que vuelva a ingresar a la sala especial más tarde. Como se muestra en el diagrama anterior, hay 3 habitaciones en este edificio.

En resumen, un monitor es una instalación que supervisa el acceso de los hilos a la sala especial. Asegura que solo un hilo pueda acceder a los datos o códigos protegidos.

2. ¿Cómo se implementa en Java?

En la máquina virtual Java, cada objeto y clase está asociado lógicamente con un monitor. Para implementar la capacidad de exclusión mutua de los monitores, se asocia un bloqueo (a veces llamado mutex) con cada objeto y clase. Esto se llama semáforo en los libros de sistemas operativos, mutex es un semáforo binario.

Si un hilo posee un bloqueo en algunos datos, entonces ningún otro puede obtener ese bloqueo hasta que el hilo que posee el bloqueo lo libere. No sería conveniente si tuviéramos que escribir un semáforo todo el tiempo cuando hacemos programación de subprocesos múltiples. Afortunadamente, no es necesario, ya que JVM lo hace por nosotros automáticamente.

  Diagrama para mostrar la inmutabilidad de las cadenas de Java

Para reclamar una región de monitor, lo que significa que los datos no son accesibles por más de un hilo, Java proporciona declaraciones sincronizadas y métodos sincronizados. Una vez que el código está incrustado con la palabra clave sincronizada, es una región de monitorización. Los bloqueos son implementados en segundo plano automáticamente por JVM.

3. En el código de sincronización de Java, ¿qué parte es monitor?

Sabemos que cada objeto / clase está asociado con un Monitor. Creo que es bueno decir que cada objeto tiene un monitor, ya que cada objeto podría tener su propia sección crítica y ser capaz de monitorear la secuencia del hilo.

Para permitir la colaboración de diferentes subprocesos, Java proporciona wait () y notificar () para suspender un subproceso y para despertar otro subproceso que está esperando en el objeto, respectivamente. Además, existen otras 3 versiones:

wait(long timeout, int nanos)
wait(long timeout) notified by other threads or notified by timeout. 
notify(all)

Estos métodos solo se pueden invocar dentro de una instrucción sincronizada o un método sincronizado. La razón es que si un método no requiere exclusión mutua, no hay necesidad de monitorear o colaborar entre hilos, cada hilo puede acceder a ese método libremente.

A continuación, se muestran algunos ejemplos de códigos de sincronización.

Referencia:
1. Documento Java para objetos
2. Sincronización de subprocesos
3. Bloqueos y sincronización
4. notificar () vs notificar a todos ()

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *