2012-12-05 1 views

Répondre

0

Veuillez vous reporter au javadoc pour Object.wait.

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#wait()

« Le thread courant doit posséder le fil libère la propriété de ce moniteur et attend jusqu'à ce qu'un autre fil informe les threads en attente sur l'écran de cet objet pour se réveiller, soit par un appel à l'informer le moniteur de cet objet. méthode ou la méthode notifyAll.Le thread attend ensuite jusqu'à ce qu'il peut obtenir la propriété du moniteur et reprend l'exécution. "

0

De The Java Tutorials

public synchronized guardedJoy() { 
// This guard only loops once for each special event, which may not 
// be the event we're waiting for. 
while(!joy) { 
    try { 
     wait(); 
    } catch (InterruptedException e) {} 
} 
System.out.println("Joy and efficiency have been achieved!"); 
} 

Pourquoi cette version de guardedJoy synchronisée? Supposons que d est l'objet que nous utilisons pour invoquer wait. Lorsqu'un thread appelle d.wait, il doit posséder le verrou intrinsèque pour d - sinon une erreur est renvoyée. Invoquer wait à l'intérieur d'une méthode synchronisée est un moyen simple d'acquérir le verrou intrinsèque.

L'erreur que vous avez est l'erreur à laquelle ils se réfèrent dans l'exemple.

0

@synchronized (Obj) {...} est comme:
SynchronizedObject.lock() ... SynchronizedObject.Unlock()

attente est essentiellement court pour:
SynchronizedObject.Unlock() & SynchronizedObject.Lock()

qui le rend plus clairement l'OMI .... vous devez avoir la serrure pour pouvoir libérer

Questions connexes