2012-03-24 10 views
55

Al leer artículos sobre hilos de Java, a menudo noto la expresión: "el hilo actual es el propietario del monitor de este objeto". Entiendo el significado: el hilo obtiene el derecho de operar sobre el objeto. Pero me sorprende por qué usamos la frase "el monitor del objeto" en lugar de "el bloqueo del objeto".¿Cuál es el significado del monitor de un objeto en Java? ¿Por qué usar esta palabra?

En resumen, no sé el significado de la palabra 'monitor' La pregunta puede ser extraña y simple. Pero me gustaría que alguien pueda ayudar a resolverlo. 3ks

+1

+1 @ulmangt por ser el único que realmente responde su pregunta: Los llamamos "monitores" porque es lo que Hoare les llamó en 1974. –

Respuesta

36

pero me sorprende por qué la palabra "el monitor del objeto" se inserta en "el bloqueo del objeto"?

Consulte la respuesta de ulmangt para ver los enlaces que explican el término "monitor" tal como se utiliza en este contexto.

¿Por qué usar el término "monitor" en lugar de "bloquear"? En términos estrictos, los términos sí significan cosas diferentes ... especialmente si los usa de la manera en que fueron originalmente destinados a ser utilizados.

  • Un "bloqueo" es algo con primitivas de adquisición y liberación que mantienen ciertas propiedades de bloqueo; p.ej. uso exclusivo o solo escritor/lector múltiple.

  • Un "monitor" es un mecanismo que garantiza que solo un subproceso puede ejecutar una determinada sección (o secciones) de código en un momento determinado. Esto se puede implementar utilizando un bloqueo (y "variables de condición" que permiten que los subprocesos esperen o envíen notificaciones a otros hilos para que se cumpla la condición), pero es más que solo un bloqueo. De hecho, en el caso de Java, el bloqueo real utilizado por un monitor no es directamente accesible. (Usted simplemente no puede decir "Object.lock()" para evitar que otros hilos de adquirirlo ... como se puede hacer con una instancia de Java Lock.)

En pocas palabras, si uno fuera a ser pedante "monitor" es en realidad un término mejor que "bloqueo" para caracterizar lo que Java proporciona. Pero en la práctica, ambos términos se usan casi de manera intercambiable.

+1

muy datailed.many gracias a usted. – jiafu

+0

Tengo otra pregunta. Cada objeto tiene información de bloqueo del self en el campo housekeerp en los datos del montón. para que sirve? – jiafu

+0

@jiafu - Es necesario porque esa es la forma en que se especifica el lenguaje Java. Pero en la práctica, la sobrecarga suele ser MENOS DE 1 PALABRA ... a menos que realmente se use el bloqueo del objeto. –

4

Cada objeto tiene algún tipo de Monitor integrado, esperando que sea utilizado por algún código. En realidad, la mayoría de los objetos nunca se utilizan como un monitor, por lo que no es necesario crearlos hasta que no se los utilice. En lugar de implementar esta característica como todos los objetos que tienen un campo de monitor privado, piense que se ha implementado como la JVM que tiene un monitor HashMap global.

Una posible implementación es esta: cada vez que se ingresa un bloque sincronizado, la JVM busca el objeto sincronizado en el mapa (monitores). Si lo encuentra, lo usa el monitor. Si no lo encuentra, ingresa en una sección crítica dedicada al mapa. A continuación, busca el objeto nuevamente porque es posible que otro hilo lo haya creado entre la comprobación anterior y la sección crítica.Si todavía no está allí, crea el monitor para el objeto sincronizado y sale de la sección crítica

+0

3k por su ayuda – jiafu

5

Un bloque synchronized alrededor de un object es su monitor, que controla un bloqueo en el objeto. Aquí un ejemplo

synchronized (object) { 
    while (<condition does not hold>) 
     object.wait(timeout); 
    ... // Perform action appropriate to condition 
} 
1

La máquina virtual Java utiliza monitores para admitir el subprocesamiento múltiple. Los monitores logran esto a través de dos conceptos: exclusión mutua al ejecutar los hilos (aquí es donde 'bloqueo' entra en escena) y coordinación como un medio de comunicación entre hilos (aquí es donde los métodos de esperar y notificar del objeto entran en la imagen).

de leer la siguiente parte de "Dentro de JVM" despejará esta duda, es que explica muy bien por aquí (Capítulo 20, la sincronización de hilos) -

https://www.artima.com/insidejvm/ed2/threadsynchP.html

0

Aunque es tarde para responder a esta pregunta, pensé simplemente agregar en caso de que sea útil.
Aquí es un bloque de código sincronizado Java dentro de un método Java no sincronizado

public void add(int value){ 
synchronized(this){ 
     this.count += value; 
    } 
} 

En el ejemplo "este" se utiliza, que es el caso, el método add se llama en. Un método de instancia sincronizada usa el objeto al que pertenece como objeto monitor.
=> Solo se puede ejecutar un subproceso dentro de un bloque de código Java sincronizado en el mismo objeto de monitor.

Cuestiones relacionadas