¿Qué es un monitor en Java?

130

¿A qué se refiere un monitor en la programación concurrente en Java?

Cuando leo que "cada objeto ha asociado un monitor", ¿qué significa?

¿Es un objeto especial?

xdevel2000
fuente
11
+1 Esto me hizo leer cómo se implementan los monitores en el nivel JVM. Aprendí algo nuevo
naikus
@naikus espero compartir detalles de ti :)
roottraveller

Respuestas:

90

Un monitor es un mecanismo para controlar el acceso concurrente a un objeto.

Esto te permite hacer:

Hilo 1:

public void a()
{
    synchronized(someObject) {
        // do something (1)
    }
}

Hilo 2:

public void b()
{
    synchronized(someObject) {
        // do something else (2)
    }
}

Esto evita que los subprocesos 1 y 2 accedan a la sección supervisada (sincronizada) al mismo tiempo. Uno comenzará y el monitor evitará que el otro acceda a la región antes de que finalice el primero.

No es un objeto especial. Mecanismo de sincronización es colocado en la clase de raíz de jerarquía: java.lang.Object.

También hay waity notifymétodos que también usarán el monitor de objetos para la comunicación entre diferentes hilos.

Pablo Santa Cruz
fuente
1
entonces ¿podemos decir que cuando creamos un método sincronizado estamos definiendo un bloqueo (monitor) en el método de ese objeto?
xdevel2000
28
Erm, no exactamente. Cada objeto tiene automáticamente un monitor (mutex) asociado, independientemente de cualquier otra cosa. Cuando declara un método sincronizado, declara que el tiempo de ejecución debe obtener el bloqueo en el monitor del objeto antes de que comience la ejecución de ese método (y debe liberar el bloqueo antes de que el control vuelva al código de llamada).
Andrzej Doyle
31
Y @Pablo: no existe un monitor para un método; Los monitores solo existen para los objetos, que serían la instancia de cierre para la mayoría de los métodos, o el Classobjeto correspondiente para los métodos estáticos. Si ya tiene un método1 sincronizado () y declara sincronizado el método2 (), no se crean nuevos monitores y, de hecho, invocar cualquiera de los métodos (en el mismo objeto) intentará bloquear el mismo monitor. Esto a menudo atrapa a los recién llegados.
Andrzej Doyle
1
@Andrzej: entonces, cada objeto tiene UN monitor asociado. Entonces puedo tener muchos métodos sincronizados. Después de cada uno de esos métodos, un hilo lo llama para obtener ese monitor que hace las cosas de sincronización.
xdevel2000
1
solo necesito aclarar esto ... ¿el objeto que se usa para llamar a un bloque sincronizado en el subproceso 1 se puede volver a usar en otro subproceso (subproceso 2) para llamar al método normal (no sincronizado) al mismo tiempo?
27

Un monitor es una entidad que posee un conjunto de bloqueo y de espera . En Java, cualquiera Objectpuede servir como monitor.

Para obtener una explicación detallada de cómo funcionan los monitores en Java, recomiendo leer la sección Mecánica del monitor de Programación concurrente en Java (el enlace anterior muestra la vista previa en los libros de Google, y esa sección está disponible para leer).

JRL
fuente
Como dijiste "Un monitor es una entidad ...", ¿significa que el monitor es un objeto / estado interno que posee / rastrea el bloqueo y el conjunto de espera? Si no, ¿puede por favor elaborar Entidad aquí? Básicamente, cuando java doc dice Wakes up all threads that are waiting on this object's monitor. acerca de notifyall (), lo que obtengo es que el objeto está manteniendo (con la ayuda de una entidad / objeto interno) lo que todos los subprocesos están esperando para bloquear, esa entidad / objeto interno se llama monitor.
user3198603
La respuesta más útil. Gracias @JRL.
gravetii
Para mí dice: "No hay vista previa disponible para esta página".
opncow
9
  1. Un monitor es un concepto / mecanismo que no se limita al lenguaje Java;
  2. "En la programación concurrente, un monitor es un objeto o módulo destinado a ser utilizado de manera segura por más de un hilo";
  3. Como todo lector sabe, cada objeto en Java es una subclase de java.lang.Object. La gente de Java creó java.lang.Object de tal manera que tiene características y características que permiten a los programadores de Java usar cualquier objeto como monitor. Por ejemplo, cada objeto tiene una cola de espera, una cola de reingreso y métodos de espera y notificación que lo convierten en un monitor;
  4. Lea acerca de los monitores aquí .
mgibson
fuente
4

El lenguaje Java y el sistema de tiempo de ejecución admiten la sincronización de subprocesos mediante el uso de monitores.
Un monitor está asociado con un elemento de datos específico (una variable de condición) y funciona como un bloqueo en esos datos. Cuando un subproceso mantiene el monitor para algún elemento de datos, otros subprocesos se bloquean y no pueden inspeccionar ni modificar los datos.


fuente
2

Monitor es una construcción de sincronización que permite que los subprocesos tengan exclusión mutua y la capacidad de esperar (bloquear) para que una determinada condición se haga realidad.

Los monitores también tienen un mecanismo para indicar a otros hilos que su condición se ha cumplido. Es una entidad que posee un conjunto de bloqueo y de espera. En Java, cualquier objeto puede servir como monitor.

En la máquina virtual Java, cada objeto y clase se asocia 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 términos de sistemas operativos, mutex es un semáforo binario.

Para más información consultar el enlace

Swati Gour
fuente