2012-06-10 22 views
5

Vi a alguien para usar assert !Thread.holdsLock(lock) para evitar el interbloqueo.¿cuál es el propósito de Thread.holdsLock (lock)?

¿cuál es el propósito de esto? Si el objeto de bloqueo está retenido por otro hilo, se reafirmará porque el código se cerrará inmediatamente.

+0

es lo que no entienden desde el javadoc: '' Devuelve verdadero si y sólo si el subproceso actual tiene el controlar el bloqueo en el objeto especificado''? –

Respuesta

6

El javadoc of the method dice:

devoluciones true si y sólo si el actual hilo mantiene el bloqueo del monitor en el objeto especificado.

(énfasis mío)

Por lo tanto, la aserción comprueba que el hilo actual no tiene el bloqueo del monitor del objeto de bloqueo dado.

Tenga en cuenta que las afirmaciones se utilizan para verificar invariantes y se pueden deshabilitar. No deben usarse para evitar un punto muerto. Se debe usar una prueba normal if para hacer eso.

3

assert palabra clave se utiliza para capturar errores; nunca debe usarse para controlar el flujo del programa. Entonces, o es un malentendido o alguien está haciendo algo muy malo.
Es más probable que la persona ponga esa afirmación allí para evitar que los desarrolladores agreguen riesgo de interbloqueo en ese segmento de código.

De esta manera:

assert !Thread.holdsLock(lock) : 
"Don't call this method while holding the lock." + 
"This method tries to acquire lock2 and that may cause a deadlock."; 
0

El Thread.holdsLock(lock) sólo sirve para comprobar si el subproceso de llamada posee lock, eso es todo.

Será no evitar los puntos muertos (habría sido tan grande para tener tal método :))

Cuestiones relacionadas