jiafu
Cuando leo artículos sobre subprocesos de Java, a menudo noto la expresión: “el subproceso actual es el propietario del monitor de este objeto”. Entiendo el significado: el hilo tiene derecho a operar en el objeto. Pero me sorprende por qué usamos la frase “el monitor del objeto” en lugar de “la cerradura del objeto”.
En resumen, no sé el significado de la palabra ‘monitor’ La pregunta puede ser extraña y simple. Pero deseo que alguien pueda ayudar a resolverlo. 3ks
esteban c
pero estoy desconcertado, ¿por qué usar la palabra “monitor del objeto” en lugar de “bloqueo del objeto”?
Consulte la respuesta de ulmangt para obtener enlaces que expliquen el término “monitor” tal como se usa en este contexto. Tenga en cuenta que:
“Los monitores fueron inventados por Per Brinch Hansen y CAR Hoare, y se implementaron por primera vez en el lenguaje Concurrent Pascal de Brinch Hansen”.
(Fuente: Wikipedia)
¿Por qué utilizar el término “supervisar” en lugar de “bloquear”? Bueno, estrictamente hablando, los términos significan cosas diferentes… especialmente si los usa de la forma en que originalmente se pretendía que se usaran.
-
Un “bloqueo” es algo con primitivas de adquisición y liberación que mantienen ciertas propiedades de bloqueo; por ejemplo, uso exclusivo o escritor único / lector múltiple.
-
Un “monitor” es un mecanismo que garantiza que solo un subproceso pueda ejecutar una determinada sección (o secciones) de código en un momento dado. Esto se puede implementar mediante un bloqueo (y “variables de condición” que permiten que los subprocesos esperen o envíen notificaciones a otros subprocesos de que se cumple la condición), pero es más que un simple bloqueo. De hecho, en el caso de Java, no se puede acceder directamente al bloqueo real utilizado por un monitor. (Simplemente no puede decir “Object.lock()” para evitar que otros subprocesos lo adquieran… como puede hacerlo con Java
Lock
instancia.)
En resumen, si uno fuera pedante, “monitor” es en realidad un término mejor que “bloqueo” para caracterizar lo que proporciona Java. Pero en la práctica, ambos términos se usan casi indistintamente.
Un monitor es simplemente un término para un objeto cuyos métodos se pueden usar de forma segura en un entorno de subprocesos múltiples.
Hay un gran artículo de Wikipedia sobre monitores:
http://en.wikipedia.org/wiki/Monitor_(sincronización)
Si se desplaza hacia abajo, incluso tiene un sección explícitamente sobre Java.
Cita de Dentro de la Máquina Virtual Java
Un subproceso en la máquina virtual Java solicita un bloqueo cuando llega al comienzo de una región de supervisión. En Java, hay dos tipos de regiones de supervisión: sentencias sincronizadas y métodos sincronizados.
Monitor
Un monitor es como un edificio que contiene una habitación especial que solo puede ser ocupada por un subproceso a la vez. La sala suele contener algunos datos. Desde el momento en que un subproceso ingresa a esta sala hasta el momento en que sale, tiene acceso exclusivo a todos los datos de la sala. Entrar en el edificio del monitor se llama “entrar en el monitor”. Entrar en la sala especial dentro del edificio se llama “adquirir el monitor”. Ocupar la habitación se llama “poseer el monitor”, y dejar la habitación se llama “liberar el monitor”. Dejar todo el edificio se llama “salir del monitor”.
Además de estar asociado con un bit de datos, un monitor está asociado con uno o más bits de código, que en este libro se denominarán regiones de monitor.
Como se mencionó anteriormente, el lenguaje proporciona dos formas integradas de identificar regiones de monitoreo en sus programas: declaraciones sincronizadas y métodos sincronizados. Estos dos mecanismos, que implementan el aspecto de exclusión mutua de la sincronización, son compatibles con el conjunto de instrucciones de la máquina virtual Java.
Cerrar
Para implementar la capacidad de exclusión mutua de los monitores, la máquina virtual de Java asocia un bloqueo (a veces llamado mutex) con cada objeto y clase. Un bloqueo es como un privilegio que solo un subproceso puede “poseer” en un momento dado.
Se permite que un solo subproceso bloquee el mismo objeto varias veces. Para cada objeto, la máquina virtual Java mantiene un recuento del número de veces que se ha bloqueado el objeto. Un objeto desbloqueado tiene una cuenta de cero. Cuando un subproceso adquiere el bloqueo por primera vez, el recuento vuelve a incrementarse a uno. Cada vez que el subproceso adquiere un bloqueo en el mismo objeto, la cuenta se incrementa nuevamente.
abas
A synchronized
bloque 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
}
La máquina virtual de Java utiliza monitores para admitir subprocesos múltiples. Los monitores logran esto a través de dos conceptos: exclusión mutua mientras se ejecutan los subprocesos (aquí es donde el ‘bloqueo’ entra en escena) y la coordinación como un medio de comunicación entre subprocesos (aquí es donde los métodos de notificación y espera del objeto entran en escena).
Leer la siguiente parte de “Inside JVM” aclarará esta duda, ¿está muy bien explicado aquí (Capítulo 20, Sincronización de subprocesos) –
Un hombre
Aunque es tarde para responder a esta pregunta, pensé en agregar en caso de que sea útil.
Aquí hay un bloque sincronizado de código Java dentro de un método Java no sincronizado
public void add(int value){
synchronized(this){
this.count += value;
}
}
En el ejemplo, se usa “this”, que es la instancia en la que se llama al método add. Un método de instancia sincronizada utiliza el objeto al que pertenece como objeto de supervisión.
=> Solo se puede ejecutar un subproceso dentro de un bloque de código Java sincronizado en el mismo objeto de monitor.
+1 @ulmangt por ser el único que realmente respondió a su pregunta: los llamamos “monitores” porque así los llamó Hoare en 1974.
– Salomón Lento
06/10/2014 a las 13:52