2012-07-03 9 views
9

¿Podría decirme si debería liberar el bloqueo antes de esperar con la condición?Condición: ¿debería desbloquearse antes de esperar?

try { 
    lock.lock(); 
    while (isNotEmpty()) { 
     condition.await(); 
    } 
} finally { 
    lock.unlock(); 
} 

O

try { 
    lock.lock(); 
    while (isNotEmpty()) { 
     lock.unlock(); 
     condition.await(); 
    } 
} finally { 
    lock.unlock(); 
} 
+1

¿Ha leído [el Javadoc] (http://docs.oracle.com/javase/7/docs /api/java/util/concurrent/locks/Condition.html)? – assylias

+1

'acquire(); prueba {use(); } finally {release(); } ' Si su adquisición ('lock') falla, liberará el recurso que nunca tuvo. En este caso, puede desbloquear un bloqueo de cerradura [reentrant]. –

Respuesta

25

No, no es necesario para liberar el bloqueo de forma explícita antes de llamar await, await permite que se abra automáticamente. De javadoc:

El bloqueo asociado con esta condición es atómicamente liberado y el hilo actual queda incapacitado para fines de programación hilo [...]

Y:

La corriente Se supone que el subproceso mantiene el bloqueo asociado con este Condition cuando se llama a este método.

4

Sólo await() en un Condition cuando se tiene bloqueo() puede ED el asociado Lock

¿Por qué no tienen una condición para estaVacia para hacer que sus condiciones más claro.

Ver el ejemplo en el Javadoc. http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html

p.

lock.lock(); 
try { 
    while (count > 0) 
    isEmpty.await(); 
    // do something when empty. 
} finally { 
    lock.unlock(); 
} 
+2

* "No puede esperar en un bloqueo, no tiene bloqueado." * Presumiblemente 'lock' es el bloqueo asociado con' condition'. –

+0

@Tudor Afortunadamente está más claro ahora. –

0

esperar y notificar debe llamarse desde en en el bloque sincronizado, por lo que se aplica la misma regla para espera y señal. Aunque esperan libera automáticamente, pero si lo hace debe estar entre bloqueo() y desbloquear()

lock.lock()   // start of synchronized block 

condition.await() 

lock.unlock()  // end of synchronized block 
Cuestiones relacionadas