2012-01-01 8 views
7

estoy muy confuso acerca de estas dos descripciones:¿Cómo entender el método de esperar y notificar en Java Thread?

  1. "Los bloques del método espera el subproceso de llamada y abandona el bloqueo del monitor"
  2. "El método de notificar a desbloquea uno esperando hilo, pero no renunciar a la monitorear bloqueo "

aquí está mi pregunta:

  1. sé que cada objeto en Java tiene un bloqueo, pero lo que es el" moni tor lock "significa? ¿es lo mismo que el bloqueo del objeto?

  2. ¿Por qué el método de notificación debe abandonar el bloqueo del monitor?

  3. Si trato de hacer un objeto de espera con el siguiente código:

    class simpleTask extends Thread 
    { 
        int waitingTime; 
    
        public simpleTask(int waitingTime) 
        { 
         this.waitingTime = waitingTime; 
        } 
    
        public void run() 
        { 
         synchronized(this) // this is a reference of current object 
         { 
         try { 
          this.wait(waitingTime); 
         } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 
    } 
    

Al igual que la primera descripción anterior, es que los medios el objeto actual es bloqueado por palabra clave sincronizada, y luego esperar método libera el bloqueo?

Respuesta

7

Sé que cada objeto en Java tiene un bloqueo, pero ¿qué significa el "bloqueo del monitor"? ¿Es lo mismo que el bloqueo del objeto?

Sí, son lo mismo. También se les llama ocasionalmente el "mutex" del objeto y el "bloqueo primitivo" del objeto. (Sin embargo, cuando alguien habla de Lock, que están hablando this Java interface ... que es un diferente mecanismo de bloqueo.)

qué método necesita notificar a abandonar el bloqueo del monitor?

El método notify no renunciar a la cerradura. Es responsabilidad de su código renunciar a la cerradura (es decirdeje el bloque sincronizado o regrese desde el método sincronizado) después de que la llamada notify regrese.

¿Por qué es necesario? Porque cualquier otro hilo que esté esperando actualmente en ese bloqueo (en una llamada wait(...)) tiene que volver a adquirir ese bloqueo antes de que se complete la llamada wait.

¿Por qué diseñaron notify/wait como este? Para que puedan ser utilizados para implementar variables de condición.

Al igual que la primera descripción anterior, ¿eso significa que el objeto actual está bloqueado por la palabra clave sincronizada, y luego el método de espera libera el bloqueo?

Eso es correcto. Cuando un hilo llama al someObject.wait() se libera su cerradura en someObject ... y luego se vuelve a adquirir (por el mismo hilo) antes de que regrese la llamada wait(). Por supuesto, mientras tanto, la cerradura someObjectpuede se ha adquirido y liberado varias veces por otros hilos. El punto es que cuando wait regresa, el hilo que llamó a wait tendrá el bloqueo.

+0

¡Gracias por su respuesta! Pero en su explicación: "Cuando llamas someObject.wait() el bloqueo del hilo en algún objeto se libera ... y luego se vuelve a adquirir antes de que la llamada a wait() regrese", ¿quién volverá a adquirir el bloqueo antes de que la llamada a wait() regrese? ¡Gracias de nuevo! –

+0

@Miles Zhang: el mismo hilo lo volverá a adquirir, siempre que esté disponible (es decir, que otro hilo ya no lo adquirió). – Tudor

+0

@MilesZhang - actualizó la respuesta para aclarar. –

0
  1. Sí, el bloqueo del monitor es el mismo que el del objeto. Si lo haces synchronized (object), ese es el candado.

  2. En su ejemplo, el objeto actual abandonará el bloqueo mientras espera, la llamada wait() deja el bloqueo. En otro hilo, se llama a notify() para reactivar el objeto, y cuando devuelve la llamada wait(), volverá a mantener el bloqueo.

+0

Gracias por su respuesta! –

0

A monitor is a type of synchronization construct.

La razón por la que la espera se da por vencido el bloqueo es para que otros hilos pueden adquirir el bloqueo, como los otros que podrían querer esperar. Además, es habitual que el hilo despierte a otros hilos para que se bloqueen antes de soltar los hilos, para evitar una condición de carrera.

Para obtener más información al respecto, debe estudiar las variables de condición (es decir, condvar).

+0

Gracias! Obtendré un poco de conocimiento sobre las variables de condición. –

Cuestiones relacionadas