Existen situaciones en las que la capacidad de anidar bloqueos en el mismo hilo es muy práctica.
Supongamos que tiene una clase con varios métodos. Supongamos que usted quiere tener un esquema de bloqueo muy simple como esto:
class A
{
public void MethodOne()
{
using (locker)
{
...body...
}
}
public void MethodTwo()
{
using (locker)
{
...body...
}
}
}
Ahora, si MethodOne
llamadas MethodTwo
, que tendrían un callejón sin salida en el comienzo de MethodTwo
, si no había una capacidad de bloqueo de reentrada en el monitor . El hilo simplemente se habría bloqueado a través del locker
.
Afortunadamente, este ejemplo solo funciona en .NET. El casillero "sabe" qué hilo lo ha bloqueado y cuántas veces y dejará pasar (solo) el hilo propietario. El recuento se utiliza para asegurarse de que el desbloqueo desde la perspectiva de otros subprocesos en espera solo se produzca al salir de MethodOne
en lugar de al salir de MethodTwo
. Este es un ejemplo de bloqueo anidado útil.
Por otro lado, el ejemplo mencionado en la pregunta parece provenir de this book. Los autores querían dejar en claro que el bloqueo anidado es posible en.NET, de forma automática; pero su código de ejemplo está ideado y no pretende aparecer en el código de nadie, excepto cuando se intenta aprender cómo funciona el bloqueo bajo el capó.
¿Quiere decir que el bloqueo se está comprobando en el mismo objeto cada vez, o en diferentes objetos? – Nathan
@Nathan same obj. –
Relacionado: http://stackoverflow.com/questions/12013089/when-would-you-ever-use-nested-locking –