2010-02-16 7 views
6

A continuación se muestra un código directamente de los tutoriales de Sun que describen Interbloqueo. Sin embargo, no entiendo cómo se puede producir un punto muerto en esta situación considerando que ambos métodos están sincronizados. ¿Cómo estarían dos Threads dentro de los mismos métodos sincronizados al mismo tiempo?Una pregunta acerca de los tutoriales de Interbloqueo del Sol

Deadlock describe una situación en la que dos o más hilos están bloqueados para siempre, esperándose unos a otros. Aquí hay un ejemplo.

Alphonse y Gaston son amigos y grandes creyentes en cortesía. Una regla estricta de cortesía es que cuando te inclines ante un amigo, debes permanecer encorvado hasta que tu amigo tenga la oportunidad de devolver el arco. Desafortunadamente, esta regla no explica la posibilidad de que dos amigos se dobleguen al mismo tiempo. Este ejemplo de aplicación, punto muerto, los modelos de esta posibilidad:

public class Deadlock { 
    static class Friend { 
     private final String name; 
     public Friend(String name) { 
      this.name = name; 
     } 
     public String getName() { 
      return this.name; 
     } 
     public synchronized void bow(Friend bower) { 
      System.out.format("%s: %s has bowed to me!%n", 
        this.name, bower.getName()); 
      bower.bowBack(this); 
     } 
     public synchronized void bowBack(Friend bower) { 
      System.out.format("%s: %s has bowed back to me!%n", 
        this.name, bower.getName()); 
     } 
    } 

    public static void main(String[] args) { 
     final Friend alphonse = new Friend("Alphonse"); 
     final Friend gaston = new Friend("Gaston"); 
     new Thread(new Runnable() { 
      public void run() { alphonse.bow(gaston); } 
     }).start(); 
     new Thread(new Runnable() { 
      public void run() { gaston.bow(alphonse); } 
     }).start(); 
    } 
} 

Cuando se ejecuta punto muerto, es muy probable que ambos hilos bloquearán cuando intentan invocar bowBack. Ninguno de los bloques terminará nunca, porque cada hilo está esperando que el otro salga del arco.

+1

posible duplicado de [Tratando de envolver mi pequeño cerebro sobre cómo los hilos se estancan]] (http://stackoverflow.com/questions/749641/trying-to-wrap-my-wee-brain-around-how-threads-deadlock) –

Respuesta

7

Los métodos sincronizados (instancia) se bloquean en el objeto, NO en la clase.

alphonse.bow toma el candado de alphonse y gaston.bow agarra el candado de gaston. Cuando el hilo 'alphonse' está en proa, intenta agarrar el bloqueo de 'gaston' en bower.bowBack. Del mismo modo, 'gaston' intenta agarrar la cerradura de 'alphonse'.

Editar para mayor claridad (espero):

Vamos a llamar a los dos hilos Thread1 y Thread2.

Thread1 ejecuta alphonse.bow (gaston), donde toma el bloqueo del objeto alphonse mientras Thread2 ejecuta gaston.bow (alphonse) y toma el bloqueo del objeto gaston.

En Thread1, cuando intenta ejecutar bower.bowBack (this), donde bower = gaston, el hilo debe adquirir primero el bloqueo de gaston.

Mientras esto sucede, Thread2 intenta hacer lo mismo, con bower = alphonse. Thread1 tiene un bloqueo que necesita Thread2 y viceversa, por lo que se produce el punto muerto.

Como un lado, no siempre es necesario un punto muerto. Si Thread1 puede comenzar y terminar antes de que Thread2 tenga la oportunidad de hacerlo (por ejemplo, si algo cuelga el hilo principal después de que Thread1 haya comenzado pero antes de que se haya creado/iniciado Thread2), entonces no se producirá un punto muerto.

+0

cómo alphonse intenta obtener un bloqueo en Gaston. alphonse siempre está usando la instancia de alphonse. – jax

+0

No entiendo lo siguiente "Cuando el hilo 'alphonse' está en proa, intenta agarrar el bloqueo de 'gaston' en bower.bowBack." ¿Cómo está 'alphonse' tratando de bloquear la instancia de Gaston? – jax

+0

El primer hilo llama a alphonse.bow (gaston). En este punto, el hilo tiene un bloqueo en alphonse. Una vez que el método desciende a bower.bowBack, donde gower está en gower, trata de bloquear Gaston. Por 'alphonse', quise decir el hilo que ejecutaba 'alphonse.bow (gaston)'; lo siento si eso no estaba claro. –

Cuestiones relacionadas